需求:

  • 给某些特定的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相关推荐

  1. Spring Boot Web 开发相关总结

    2019独角兽企业重金招聘Python工程师标准>>> 1. 表单验证 首先, 在实体类的需要验证的字段上添加添加验证注解, 验证注解类主要在 validation-api-1.1. ...

  2. 十、springboot注解式AOP(@Aspect)统一日志管理

    springboot注解式AOP(@Aspect)统一日志管理 简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功 ...

  3. SpringBoot—集成AOP详解(面向切面编程Aspect)

    关注微信公众号:CodingTechWork,一起学习进步. AOP介绍 AOP概述   AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释: ...

  4. SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)

    文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...

  5. springboot~使用自定义的aspect

    对某个类型中的方法进行拦截,然后加入固定的业务逻辑,这是AOP面向切面编程可以做的事,在springboot里实现aop的方法也有很多,spring-boot-starter-aop或者aspectj ...

  6. 用aspect在springboot中记录操作日志至数据库的详细过程

    代码来自若依管理系统的后台,我截取的其中用于记录操作日志的部分 1.切面 2.操作日志表 3.spring工具类 4.客户端工具类 异步工厂(产生任务用) 异步任务管理器 5.服务层 6.控制层 1. ...

  7. Springboot的@Aspect使用

    一.在执行NewCarCenterOutController类的所有方法前后执行切面@Before和@After方法 package com.dst.common;import org.aspectj ...

  8. Springboot AOP Aspect 拦截中 获取HttpServletResponse response

    代码: ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequest ...

  9. Springboot 利用AOP编程实现切面日志

    前言 踏入Springboot这个坑,你就别想再跳出来.这个自动配置确实是非常地舒服,帮助我们减少了很多的工作.使得编写业务代码的时间占比相对更大.那么这里就讲一下面向切面的日志收集.笔者使用lomb ...

  10. 【springboot】入门

    简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...

最新文章

  1. 在wpf中运行EXE文件
  2. Stanford UFLDL教程 独立成分分析
  3. 导航栏对于UIScrollview以及子类所做的一些事
  4. C# (类型、对象、线程栈和托管堆)在运行时的相互关系
  5. 工作单元php,php – 无法从工作单元测试用例构建最简单的套件
  6. 做系统ghost步骤图解_Ghost 博客搭建超全指南
  7. 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现
  8. [vue] 说说你对vue的mixin的理解,有什么应用场景?
  9. 知识图谱最新权威综述论文解读:时序知识图谱部分
  10. html resize 最小,Html5 Canvas resize
  11. SAAS多租户实现方案_springboot 实现多租户_基于数据库服务器隔离_或共享数据库服务器_但隔离数据库---springcloud工作笔记159
  12. MySQL提供链接途径_MySQL 连接
  13. python网络虫营销_python与sem,大数据降低竞价推广成本利器
  14. 干货!谷歌首席科学家发文阐述“半监督学习革命”,想走出瓶颈先试试这个...
  15. STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf;
  16. Arcgis 重装 的 license 问题
  17. 星际译王,金山词霸,有道词典,词库下载 1
  18. 黑马程序员---初学java建议(亲身经历)
  19. 锤子终究走起了小米的路子
  20. Jmeter 压测和AB压测的比较

热门文章

  1. 1月好书推荐-8本值得读的好书,让你受益终生
  2. Base64转换成图片
  3. Mac VMWare键盘鼠标失灵
  4. ks 曲线_Ks密度曲线分布图绘图
  5. 梁宁产品思维 一张图
  6. 联想微型计算机快捷键,联想笔记本电脑快捷键大全
  7. 基于FPGA的虚拟示波器的设计
  8. Verliog 写电子密码锁
  9. [转载]2012 年 4 月,水王排行榜
  10. 博客左侧导航栏添加打赏功能(添加微信赞赏码)