spring aop 自定义注解保存操作日志到mysql数据库

  • 一、思路
  • 二、自定义注解
  • 三、编写操作日志
  • 四、编写操作日志切面\增强
  • 五、使用
  • 六、`注意`

一、思路

利用spring aop 对方法进行增强,获取用户操作的各种信息。

二、自定义注解

/*** 操作日志注解** @author chenjiayan* @date 2022/12/21*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OptLog {/*** @return 操作类型*/String optType() default "";}

三、编写操作日志

包括实体类,service,mapper等,这里就不再过多赘述

操作日志实体类 仅供参考

/*** <p>* 操作日志* </p>** @author chenjiayan* @since 2022-12-21*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_operation_log")
@ApiModel(value="OperationLog对象", description="")
public class OperationLog implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "日志id")@TableId(value = "id", type = IdType.AUTO)private Long id;@ApiModelProperty(value = "操作模块")private String optModule;@ApiModelProperty(value = "操作类型")private String optType;@ApiModelProperty(value = "操作url")private String optUrl;@ApiModelProperty(value = "操作方法")private String optMethod;@ApiModelProperty(value = "操作描述")private String optDesc;@ApiModelProperty(value = "请求参数")private String requestParam;@ApiModelProperty(value = "请求方式")private String requestMethod;@ApiModelProperty(value = "返回数据")private String responseData;@ApiModelProperty(value = "用户id")private Integer userId;@ApiModelProperty(value = "用户昵称")private String nickname;@ApiModelProperty(value = "操作ip")private String ipAddress;@ApiModelProperty(value = "操作地址")private String ipSource;@ApiModelProperty(value = "创建时间")@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}

service和mapper我就不写了,请自行编写。

四、编写操作日志切面\增强

这里运用到了swagger的相关注解,不了解的可以先去学习一下,比较简单

/*** 操作日志切面处理* chenjiayan* 2022/12/21*/
@Aspect
@Component
public class OptLongAspect {@Autowiredprivate OperationLogService operationLogService = new OperationLogServiceImpl();/*** 设置操作日志切入点 记录操作日志 在注解的位置切入代码*/@Pointcut("@annotation(fit.littlefox.blog.annotation.OptLog)")public void optLogPointCut(){}@AfterReturning(value = "optLogPointCut()",returning = "keys")public void saveOptLog(JoinPoint joinPoint,Object keys){// 获取RequestAttributesRequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 从获取RequestAttributes中获取HttpServletRequest的信息HttpServletRequest request = (HttpServletRequest) Objects.requireNonNull(requestAttributes).resolveReference(RequestAttributes.REFERENCE_REQUEST);OperationLog operationLog = new OperationLog();// 从切面织入点处通过反射机制获取织入点处的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 获取切入点所在的方法Method method = signature.getMethod();// 获取操作(类上的注解)Api api = (Api) signature.getDeclaringType().getAnnotation(Api.class);ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);OptLog optLog = method.getAnnotation(OptLog.class);// 操作模块operationLog.setOptModule(api.tags()[0]);// 操作类型 (增删改查)operationLog.setOptType(optLog.optType());// 操作urloperationLog.setOptUrl(request.getRequestURI());// 操作方法// 1.获取请求的类名String className = joinPoint.getTarget().getClass().getName();// 2.获取请求的方法名String methodName = method.getName();methodName = className+"."+methodName;operationLog.setOptMethod(methodName);// 操作描述operationLog.setOptDesc(apiOperation.value());// 请求参数operationLog.setRequestParam(JSON.toJSONString(joinPoint.getArgs()));// 请求方式(GET,POST,PUT...)operationLog.setRequestMethod(Objects.requireNonNull(request).getMethod());// 返回数据operationLog.setResponseData(JSON.toJSONString(keys));// 操作用户idoperationLog.setUserId(UserUtils.getLoginUser().getId());// 操作用户昵称operationLog.setNickname(UserUtils.getLoginUser().getNickname());// 操作/请求 ipString ipAddress = IpUtils.getIpAddress(request);operationLog.setIpAddress(ipAddress);// 操作/请求 地址operationLog.setIpSource(IpUtils.getIpSource(ipAddress));// 保存operationLogService.save(operationLog);}}

五、使用

编写完上述代码,使用就非常简单了,只需在想要记录操作日志的方法上添加自定义的注解(@OptLog(“操作类型”))就行了

例如:

    /*** 添加或修改文章** @param articleVO 文章信息* @return {@link Result<>}*/@OptLog(optType = SAVE_OR_UPDATE)@ApiOperation(value = "添加或修改文章")@PostMapping("/admin/articles")public Result<?> saveOrUpdateArticle(@Valid @RequestBody ArticleVO articleVO) {articleService.saveOrUpdateArticle(articleVO);return Result.ok();}

六、注意

上述代码用到了很多工具类(IpUtils用来解析ip的工具类、UserUtils用来获取用户信息的工具类),这里就不再提供了,可以根据自己的情况编写或者在网上进行搜索。
总之,上述代码只是教你如何使用 spring aop 自定义注解保存操作日志到mysql数据库,具体的很多地方都可以根据自己的情况进行添加修改。

spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)相关推荐

  1. spring - AOP(6)- 记录后台管理员操作日志

    一.需求 1.1 问题 后台一些涉及到新增.编辑.删除等敏感操作的需要记录下操作日志,包含操作人.操作内容.请求参数等等信息. 1.2 思路 统一对Controller层的方法进行拦截,记录下请求信息 ...

  2. vue极简代码实现自定义可编辑行及操作按钮的Table表格组件(含源码及演示视频)

    效果图如下: 涉及到技术点包括: 父组件给子组件传值props.动态赋值 refs 对DOM进行操作,slot具名插槽的使用,插槽通过slot-scope给父组件传值 父组件代码: <templ ...

  3. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  4. Spring Boot Aop结合Swagger记录用户操作日志

    1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swag ...

  5. console.log打印:自定义样式(含源码、效果图)

    console.log打印:自定义样式(含源码.效果图) 效果图 · 示下: 案例 · 代码如下: 使用说明: 真的可以实现控制台打印出来的内容:有不同的font-size.不同的color.不同的渐 ...

  6. python爬取豆瓣读书top250并保存xls(含源码)

    python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...

  7. Flutter 组件之 Flutter高级自定义TabBar(教程含源码)

    实战需求 Flutter 组件之 Flutter高级自定义TabBar(教程含源码) 本文价值与收获 看完本文后,您将能够作出下面的界面 实战代码 import 'package:flutter/ma ...

  8. SwiftUI 动画大全之 五彩纸屑特效含三角形、五星、钻石与自定义图像 (教程含源码)

    实战需求 SwiftUI 动画大全之 五彩纸屑特效含三角形.五星.钻石与自定义图像 (教程含源码) 下雨了,五彩纸屑!SAConfettiView是向您的应用程序添加有趣.多彩的五彩纸屑并让用户感到有 ...

  9. Java之——Spring AOP自定义注解实现日志管理

    转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80295737 1.定义日志类SystemLog package io.mykit ...

最新文章

  1. AI 通过眼睛的反光度,来识别是否 Deepfake 换脸
  2. 一文讲清楚什么是迁移学习?以及它都用在哪些深度学习场景?
  3. 公有云厂商DDoS防护产品竞品分析——内含CC的一些简单分析,貌似多是基于规则,CC策略细粒度ip/url//ua/refer...
  4. r语言和python-R语言和Python哪个适合生物信息学?
  5. Docker操作系统理解
  6. 整型和浮点型的区别_浮点整型强转的一个题目解析
  7. mysql要怎么定义环境变量_mysql设置环境变量
  8. ClassPathBeanDefinitionScanner 扫描给定的包及其子包
  9. express-generator——Express应用生成器贼快!
  10. 【汇编语言】8086汇编的loop循环与[bx]寻址(王爽第五章5.5节学习笔记)
  11. 听说程序员普遍存在这 7 个坏习惯,你如果有其中一点,千万注意了!
  12. asp mysql 设置编码_ASP对数据库各种操作的代码
  13. 学了python能干啥举例-原来Python可以做这么多有趣的事情
  14. 【TJOI2016】【bzoj4552】排序(二分答案+线段树01排序)
  15. 过滤HTML标记、HTML注释、“!@#¥%”等非法字符
  16. 第七届蓝桥杯省赛--四平方和
  17. Linux上创建SSH隧道
  18. 移远ec20型号区别_移远EC20CEFDKG PCIE 全网通4G模块 增加B5频段 性价更高
  19. 小白服务器编程指北(2)——用Docker编配你的服务器环境
  20. python通过ssh通道连接PostgreSQL数据库(mysql等类同)

热门文章

  1. John the ripper破解Linux密码
  2. Win10驱动开发2——双机调试
  3. [行业调研]NAO机器人相关
  4. vue页面绘图_GitHub - Mchen1197729/vue-draw: 利用VueZrender编写的一个简易的画图页面...
  5. 安卓 设置banner圆角(不是背景圆角)
  6. 【BestCoder】#29 C GTY's gay friends(区间和 随机数判重)
  7. 下拉选数据查询过来的如何设置默认值为空_如何在某些情况下禁止提交Select下拉框中的默认值或者第一个值(默认选中的就是第一个值啦……)...
  8. 2013都发生了什么?
  9. 【ROS】rostopic:ROS话题
  10. Permission denied: ‘test_1.csv‘的错误