Springboot @Aspect
需求:
- 给某些特定的api 打统一规范的log
- 对某些固定的api 做权限校验
进程:
- 权限校验和统一的log 这只有两件事情,如果要在每个api 前面带上校验后面带上log那不改到天都黑了
- 使用 @Aspect 这个注解叫切面,他可以在api 请求的前后做一些额外的事情
- 首先加上aop 的依赖
<artifactId>spring-boot-starter-aop</artifactId>
- 创建一个类标记为 @Aspect
@Aspect @Component public class LogAspect{}
- 标记这个类是为了哪些api 在方法上加上@Pointcut 做拦截处理
// excution 模式 //表示public 的返回类型为所有类型的 方法在com.controller 包下的所有子包,下的所有方法名,任意参数单api // 第一个 * 表示所有返回类型, controller 后的 .. 表示所有的子包,后面的 * 表示所有的类,.* 表示所有的方法, (..) 表示任意的参数@Pointcut("execution(public * com.controller..*.*(..))") private void webLog() { }//annotation 模式 //表示针对有 ApiToken 注解的方法使用这个切面 @Pointcut("@annotation(common.annotation.ApiToken)") private void webLog() { }
- 使用 @Around 通过切面开始对api 做统一log
@Around("webLog()") public Object permissionCheck(ProceedingJoinPoint joinPoint) throws Throwable {log.info("start"); // 获取当前请求对象ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();for (Object object : joinPoint.getArgs()) {if (object instanceof TokenAuthApi) {TokenAuthApi api = (TokenAuthApi) object;appKey = api.getAppKey();// 设置body的参数,供统一异常处理时获取request.setAttribute("appKey", appKey);} }// proceed 表示开始执行原本需要执行的进程,返回的result 是原本应该会返回到前端的数据,proceed 也可以传入参数,传入的参数会完全替换掉之前的参数,要谨慎使用Object result = joinPoint.proceed();log.info("end"); // 这边必须要做一个返回,甚至这边可以对result 做一个删减处理,但是不建议在这边对处理做处理return result; }
- 如果只是期望在切面方法之前调用可以使用 @Before,在之后可以使用@After,不过我觉得,around就可以满足这两个注解的使用,如果是在切面的时候抛出异常可以用@AfterThrowing,在返回之后可以用 @AfterReturning,来捕获方法所有都完成之后的返回值这个方法会多一个参数
@AfterReturning(pointcut = "webLog()", returning = "result")public void doAfterReturning(JoinPoint joinPoint, Object result) {Signature signature = joinPoint.getSignature();String classMethod = signature.getName();log.info("方法{}执行完毕,返回参数为:{}", classMethod, result);}@AfterThrowing(pointcut = "webLog()", throwing = "ex")public void afterThrowing(JoinPoint joinPoint, Throwable ex) {Signature signature = joinPoint.getSignature();String method = signature.getName();// 处理异常的逻辑log.info("执行方法{}出错,异常为:{}", method, ex);}
拓展:
- 除了切面还有过滤器,拦截器,监听器
Springboot @Aspect相关推荐
- Spring Boot Web 开发相关总结
2019独角兽企业重金招聘Python工程师标准>>> 1. 表单验证 首先, 在实体类的需要验证的字段上添加添加验证注解, 验证注解类主要在 validation-api-1.1. ...
- 十、springboot注解式AOP(@Aspect)统一日志管理
springboot注解式AOP(@Aspect)统一日志管理 简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功 ...
- SpringBoot—集成AOP详解(面向切面编程Aspect)
关注微信公众号:CodingTechWork,一起学习进步. AOP介绍 AOP概述 AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释: ...
- SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)
文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...
- springboot~使用自定义的aspect
对某个类型中的方法进行拦截,然后加入固定的业务逻辑,这是AOP面向切面编程可以做的事,在springboot里实现aop的方法也有很多,spring-boot-starter-aop或者aspectj ...
- 用aspect在springboot中记录操作日志至数据库的详细过程
代码来自若依管理系统的后台,我截取的其中用于记录操作日志的部分 1.切面 2.操作日志表 3.spring工具类 4.客户端工具类 异步工厂(产生任务用) 异步任务管理器 5.服务层 6.控制层 1. ...
- Springboot的@Aspect使用
一.在执行NewCarCenterOutController类的所有方法前后执行切面@Before和@After方法 package com.dst.common;import org.aspectj ...
- Springboot AOP Aspect 拦截中 获取HttpServletResponse response
代码: ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequest ...
- Springboot 利用AOP编程实现切面日志
前言 踏入Springboot这个坑,你就别想再跳出来.这个自动配置确实是非常地舒服,帮助我们减少了很多的工作.使得编写业务代码的时间占比相对更大.那么这里就讲一下面向切面的日志收集.笔者使用lomb ...
- 【springboot】入门
简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...
最新文章
- 在wpf中运行EXE文件
- Stanford UFLDL教程 独立成分分析
- 导航栏对于UIScrollview以及子类所做的一些事
- C# (类型、对象、线程栈和托管堆)在运行时的相互关系
- 工作单元php,php – 无法从工作单元测试用例构建最简单的套件
- 做系统ghost步骤图解_Ghost 博客搭建超全指南
- 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现
- [vue] 说说你对vue的mixin的理解,有什么应用场景?
- 知识图谱最新权威综述论文解读:时序知识图谱部分
- html resize 最小,Html5 Canvas resize
- SAAS多租户实现方案_springboot 实现多租户_基于数据库服务器隔离_或共享数据库服务器_但隔离数据库---springcloud工作笔记159
- MySQL提供链接途径_MySQL 连接
- python网络虫营销_python与sem,大数据降低竞价推广成本利器
- 干货!谷歌首席科学家发文阐述“半监督学习革命”,想走出瓶颈先试试这个...
- STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf;
- Arcgis 重装 的 license 问题
- 星际译王,金山词霸,有道词典,词库下载 1
- 黑马程序员---初学java建议(亲身经历)
- 锤子终究走起了小米的路子
- Jmeter 压测和AB压测的比较