springboot整合AOP记录用户操作

妖狐艹你老母 2023-07-22 09:20 36阅读 0赞

本次示例是使用springboot版本:2.2.6.RELEASE 数据库使用:Mysql ,通过aop记录用户访问记录。

目录

一、引入依赖

二、创建controller模拟请求

三、定义切面类,实现web层的日志切面

四、测试结果


一、引入依赖

只需引入以下依赖即可,我看关系图可以看出,在data中含有aop的包。因此不需要另外再引入aop的依赖。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjIyODk1MA_size_16_color_FFFFFF_t_70

二、创建controller模拟请求

  1. @RequestMapping(value = "/test",method =RequestMethod.GET )
  2. public String welcome(String id,String name){
  3. System.out.println("Crud Spring Boot Project ! "+"参数:"+id+","+name);
  4. return "Crud Spring Boot Project ! ";
  5. }

三、定义切面类,实现web层的日志切面

@Component 注解可以把切面类加入到IOC容器中

@Aspect 注解可以使之成为切面类

通过JoinPoint可以获得通知的签名信息,如目标方法名、目标方法参数信息等;

通过RequestContextHolder来获取请求信息,Session信息;

  1. package com.springboot.aspect;
  2. import org.aspectj.lang.JoinPoint;
  3. import org.aspectj.lang.annotation.*;
  4. import org.springframework.stereotype.Component;
  5. import java.util.ArrayList;
  6. import java.util.Collections;
  7. import java.util.List;
  8. @Aspect
  9. @Component
  10. public class OperateRescordAspect {
  11. @Pointcut("execution(public * com.springboot.controller.UserController.*(..))")
  12. public void pintCut(){}
  13. /**
  14. * 前置通知:方法执行前拦截到
  15. * @param point
  16. */
  17. @Before("pintCut()")
  18. public void before(JoinPoint point){
  19. String methodName = point.getSignature().getName();
  20. Object [] params = point.getArgs();
  21. List< Object> list = new ArrayList<Object>(params.length);
  22. Collections.addAll(list,params);
  23. System.out.println("前置通知--方法名:"+methodName+",参数:"+list);
  24. }
  25. /**
  26. * 环绕通知
  27. * @param point
  28. */
  29. //@Around(value = "execution(public * com.springboot.controller.UserController.*(..))")
  30. // @Around("pintCut()")
  31. public void around(JoinPoint point){
  32. System.out.println("环绕通知");
  33. }
  34. /**
  35. * 后置通知:当目标方法执行完之后,不管抛不抛异常都会走此方法
  36. * @param point
  37. */
  38. //@After(value = "execution(public * com.springboot.controller.UserController.*(..))")
  39. //@After("pintCut()")
  40. public void after(JoinPoint point){
  41. System.out.println("后置通知");
  42. }
  43. /**
  44. * 返回通知:当方法正常执行通过之后执行
  45. * @param point
  46. * @param result 返回值
  47. */
  48. //@AfterReturning(value="execution(public * com.springboot.controller.UserController.*(..))",returning="result")
  49. //@AfterReturning(returning = "result",pointcut = "pintCut()")
  50. public void afterReturning(JoinPoint point, Object result){
  51. System.out.println("返回通知"+",返回结果:"+result);
  52. }
  53. /**
  54. * 异常通知:当目标方法非正常执行完成、发生异常、抛出异常的时候会走此方法
  55. */
  56. //@AfterThrowing(value="execution(public * com.springboot.controller.UserController.*(..))",throwing="e")
  57. @AfterThrowing(pointcut = "pintCut()",throwing="e")
  58. public void afterThrowing(JoinPoint joinPoint, Exception e){
  59. System.out.println("异常通知,"+"异常信息:"+e);
  60. }
  61. }

四、测试结果

通过访问:http://localhost:8080/userController/test?id=345&name=hahha 可以在控制台打印以下内容

20200405140132149.jpg

发表评论

表情:
评论列表 (有 0 条评论,36人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot+AOP实现用户操作日志的记录

    前言: 任何一个项目都会有一个用户操作日志(也叫行为日志)的模块,它主要用来记录某个用户做了某个操作,当出现操作失败时,通过日志就可以快速的查找是哪个用户在哪个模块出现了错