1、引入依赖

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!-- aop依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>

2、实现思路

可以自己写一个注解,然后作用于方法上,不过借助swagger可以更方便的实现,使用@Api作用于类上,用来标识业务模块,使用@ApiOperation作用于方法上,用来标识具体方法,然后将切入点设置为注解ApiOperation:

@Pointcut("@annotation(io.swagger.annotations.ApiOperation) && (!@annotation(org.springframework.web.bind.annotation.GetMapping))")

这样设置后,当含有注解@ApiOperation的方法被执行时,就会执行环绕通知( @Around() )内的方法,注意,这里过滤掉了Get请求。

3、代码示例

控制器代码:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Api(tags = "user", value = "用户模块")
@RestController
@RequestMapping("/user")
public class UserController {@ApiOperation(value = "登录", notes = "用户登录")@ApiImplicitParams({@ApiImplicitParam(name = "username", value = "用户名", paramType = "query", dataTypeClass = String.class),@ApiImplicitParam(name = "passwd", value = "密码", paramType = "query", dataTypeClass = String.class),})@GetMapping("/login")public String login(String username,String passwd){return "登录成功" + username + "===>" +passwd;}@ApiOperation(value = "注销", notes = "用户注销")@ApiImplicitParams({@ApiImplicitParam(name = "username", value = "用户名", paramType = "query", dataTypeClass = String.class)})@GetMapping("/logout")public String logout(String username){return "注销成功";}}

日志切面代码:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;/*** 日志切面* @author liyinlong* @date 2021/7/14 4:19 下午*/
@Aspect
@Component
public class LogAspect {@Pointcut("@annotation(io.swagger.annotations.ApiOperation && (@annotation(org.springframework.web.bind.annotation.GetMapping))")public void pointcut() {}@Around("pointcut()")public Object around(ProceedingJoinPoint point) {System.out.println("记录操作日志");Object result = null;long beginTime = System.currentTimeMillis();try {// 执行方法result = point.proceed();} catch (Throwable e) {e.printStackTrace();}// 执行时长(毫秒)long time = System.currentTimeMillis() - beginTime;// 保存操作日志saveLog(point, time);System.out.println("执行结果:");System.out.println(result);return result;}private void saveLog(ProceedingJoinPoint joinPoint, long time) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();Class<?> aClass = joinPoint.getTarget().getClass();Api annotation = aClass.getAnnotation(Api.class);String moduleName = annotation.value();if (moduleName != null) {System.out.println("模块:" + moduleName);}Method method = signature.getMethod();ApiOperation logAnnotation = method.getAnnotation(ApiOperation.class);if (logAnnotation != null) {// 注解上的描述System.out.println("操作:" + logAnnotation.value());}// 请求的方法名String className = joinPoint.getTarget().getClass().getName();String methodName = signature.getName();System.out.println("方法:" + className + "." + methodName + "()");// 请求的方法参数值Object[] args = joinPoint.getArgs();// 请求的方法参数名称LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();String[] paramNames = u.getParameterNames(method);// 拼接请求参数if (args != null && paramNames != null) {String params = "";for (int i = 0; i < args.length; i++) {params += "  " + paramNames[i] + ": " + args[i];}System.out.println("参数:" + params);}// 获取RequestAttributesRequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 从获取RequestAttributes中获取HttpServletRequest的信息HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 从获取RequestAttributes中获取HttpServletResponse的信息HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {System.out.println(cookie.getName() + " " + cookie.getValue());}}System.out.println("请求者的IP:" + request.getRemoteHost());int status = response.getStatus();System.out.println("http状态码 " + status);System.out.println("执行时间:" + time + " 毫秒");}}

参考:https://www.cnblogs.com/cxuanBlog/p/13060510.html

Spring Boot Aop结合Swagger记录用户操作日志相关推荐

  1. Spring Boot + Aop 记录用户操作日志

    目录 一.前言 二.实战 1.设计用户操作日志表: sys_oper_log 2.引入依赖 3.自定义用户操作日志注解 4.自定义用户操作日志切面 5.MyLog注解的使用 6.最终效果 三.总结 一 ...

  2. ssm 项目记录用户操作日志和异常日志

    ssm 项目记录用户操作日志和异常日志 参考文章: (1)ssm 项目记录用户操作日志和异常日志 (2)https://www.cnblogs.com/mei-m/p/10231792.html (3 ...

  3. Linux记录用户操作日志

    前言 我这里计划用SLS做服务器日志审计,安装Logtail后通过 [分隔符-文本] 的方式,采集服务器各种相关日志,大概需要以下内容(目录可能是错的,这个是做等保的评测的兄弟发过来的) /var/l ...

  4. Spring Boot AOP记录用户操作日志

    一.引入必要依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId> ...

  5. 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录

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

  6. ssm实现文件上传到SFTP服务器,centos7系统配置记录SFTP操作日志

    1.修改ssh配置 [root@elk-node2 ~]# vim /etc/ssh/sshd_config 大概132行把下面这个句注释掉 #Subsystem       sftp    /usr ...

  7. mysql中用户操作日志_Mysql 纪录用户操作日志

    我们想追踪某个数据库操作记录,如想找出是谁操作了某个表(比如谁将字段名改了). 二进制日志记录了操作记录,线程号等信息,但是却没有记录用户信息,因此需要结合init-connect来实现追踪. ini ...

  8. spring boot项目怎么记录用户操作行为和登录时间_6 个 Github 项目拿下 Spring Boot

    经常浏览技术社区.技术公众号的读者会有一个感受,那么就是 Spring Boot 相关的文章和相关咨询越来越多.包括小逛和技术公众号的博主交流,他们也发现推送 Spring Boot 相关的文章阅读量 ...

  9. 使用Spring AOP自定义注解方式实现用户操作日志记录

    1,开发环境 操作系统:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定义注解类UserLog @Target({ElementT ...

最新文章

  1. Android Tab大总结 Fragment+TabPageIndicator+ViewPager
  2. Nginx-09:Nginx原理
  3. HDU4143-A Simple Question数论题解
  4. MyBatis 源码解读-pluginElement()
  5. 我的SAP Hybris学习笔记
  6. matlab 6.5 设计数字滤波器
  7. 使用Angularjs的ng-cloak指令避免页面乱码
  8. Spring整合Junit框架进行单元测试Demo
  9. Java入门——(5)Java API
  10. UIWebView背景透明的方法
  11. CSS3的clac 没有效果,警告提示“invalid property value”
  12. C语言实现连接MySQL服务器CURD
  13. Xdebug中文文档-堆栈跟踪
  14. 泰坦尼克号任务-模型建立和评估
  15. c语言6行6列元素奇数的个数,C语言任意输入n个整数,分别统计奇数的和.奇数的个数.偶数的和.偶数的个数....
  16. 学校计算机机械设备管理制度,计算机教室设备管理制度.doc
  17. 设计师的助手lt;精品辅助软件下载集…
  18. 深度学习之3D卷积神经网络
  19. java part part_Java Nashorn--Part 5
  20. 【Unity2019】利用Vuforia在安卓平台调用UVC相机

热门文章

  1. Java调用MySQL并返回数据_Java调用MySQL存储过程并获得返回值的方法
  2. Ubuntu apt安装包 dev、dbg、utils后缀的含义
  3. 看了5本书,发现回忆式学习是最有效的方法
  4. 2020一战中科大计算机初复试经验贴
  5. 教你用python在excel中“画画”
  6. 如何拿到tabbarcontroller,如何拿到主导航控制器
  7. 支撑程序员的三种精神
  8. 求生之路:学术生涯的17条简单生存法则
  9. java和web哪个难_web前端和java哪个难学?哪个简单?
  10. 《计算机网络:自顶向下方法》学习笔记——第六章:链路层