AOP案例-记录日志操作

这篇具有很好参考价值的文章主要介绍了AOP案例-记录日志操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

案例

操作日志

思路分析

步骤

准备

编码


案例

  • 将案例中的增删改接口的操作日志记录到数据表中

操作日志

  • 日志信息包括:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时的参数、返回值、犯法运行时长。

思路分析

  • 需要对于所有业务类中的增删改查方法统一添加功能,使用AOP技术最方便,@Around环绕通知
  • 由于增删改方法名命名不规律,可以自定义@Log注解完成目标方法的匹配

步骤

准备
  • 引入AOP的起步依赖
  • 导入资料中准备好的数据表结构,并引入对应的实体类
    • 数据结构表
      • -- 操作日志表
        create table operate_log(
                                    id int unsigned primary key auto_increment comment 'ID',
                                    operate_user int unsigned comment '操作人ID',
                                    operate_time datetime comment '操作时间',
                                    class_name varchar(100) comment '操作的类名',
                                    method_name varchar(100) comment '操作的方法名',
                                    method_params varchar(1000) comment '方法参数',
                                    return_value varchar(2000) comment '返回值',
                                    cost_time bigint comment '方法执行耗时, 单位:ms'
        ) comment '操作日志表';
        
        
        
        
    • 实体类(用于封装操作日志信息)文章来源地址https://www.toymoban.com/news/detail-702760.html

      • package com.example.tlias.pojo;
        
        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        
        import java.time.LocalDateTime;
        
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        public class OperateLog {
            private Integer id; //ID
            private Integer operateUser; //操作人ID
            private LocalDateTime operateTime; //操作时间
            private String className; //操作类名
            private String methodName; //操作方法名
            private String methodParams; //操作方法参数
            private String returnValue; //操作方法返回值
            private Long costTime; //操作耗时
        }
        
编码
  • 自定义注解@Log
    • package com.example.tlias.Anno;
      
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      
      @Retention(RetentionPolicy.RUNTIME) // todo 设置该疏解的生效时间
      @Target(ElementType.METHOD) // todo 设置该注解可以作用在方法上
      public @interface Log {
      }
      
  • 定义切面类,完成记录操作日志的逻辑
    • package com.example.tlias.AOP;
      
      import com.alibaba.fastjson.JSONObject;
      import com.example.tlias.mapper.OperateLogMapper;
      import com.example.tlias.pojo.OperateLog;
      import com.example.tlias.utils.JwtUtils;
      import io.jsonwebtoken.Claims;
      import jakarta.servlet.http.HttpServletRequest;
      import lombok.extern.slf4j.Slf4j;
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.Around;
      import org.aspectj.lang.annotation.Aspect;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Component;
      
      import java.time.LocalDateTime;
      import java.util.Arrays;
      
      @Component
      @Aspect // todo 表名当前类是一个切面类
      @Slf4j
      public class LogAspect {
          @Autowired
          private OperateLogMapper operateLogMapper;
      
          // todo 注入当前请求的请求对象
          @Autowired
          private HttpServletRequest request;
      
          // todo 定义通知方法
          @Around("@annotation(com.example.tlias.Anno.Log)")  // todo 使用注解的方法设置切入点
          public Object LogAspect(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
              // todo 获取操作人的id--即当前登录员工的id
              // 获取请求头中的JWT令牌,解析令牌就可获取登录员工的ID
              String jwt = request.getHeader("token");
              // 使用之前编写好的解析JWT令牌的工具类来解析获取到的JWT令牌
              Claims claims = JwtUtils.parseJWT(jwt);
              Integer OperateUserID = (Integer) claims.get("id");
              // todo 获取操作类名
              String ClassName = proceedingJoinPoint.getTarget().getClass().getName();
              // todo 获取操作时间
              LocalDateTime OperateTime = LocalDateTime.now();
              // todo 获取操方法名
              String MethodName = proceedingJoinPoint.getSignature().getName();
              // todo 获取操作方法参数
              Object[] args = proceedingJoinPoint.getArgs();
              // 将数组类型数据转换为字符串类型
              String MethodParams = Arrays.toString(args);
              // todo 获取操作方法运行开始时间
              // 先获取开始时间,方法运行完成之后再获取结束时间
              Long start = System.currentTimeMillis();
              // todo 获取操作方法返回值
              // 调用原始目标方法运行
              Object result = proceedingJoinPoint.proceed();
              // 将对象专为JSON格式数据的字符串,仍然使用工具包JSONFast
              String returnValue = JSONObject.toJSONString(result);
              // todo 获取操作方法运行结束时间
              Long end = System.currentTimeMillis();
              // 计算方法运行耗时
              Long coatTime = end - start;
              // todo 使用全参构造,完成数据的封装
              OperateLog operateLog = new OperateLog(null, OperateUserID, OperateTime, ClassName, MethodName, MethodParams, returnValue, coatTime);
              // todo 向operateLog对象中封装相关信息
      //        operateLog.setClassName(ClassName);
      //        operateLog.setCostTime(coatTime);
      //        operateLog.setMethodName(MethodName);
      //        operateLog.setMethodParams(MethodParams);
      //        operateLog.setOperateTime(OperateTime);
      //        operateLog.setOperateUser(OperateUserID);
      //        operateLog.setReturnValue(returnValue);
      //        operateLogMapper.insert(operateLog);
              // todo 完成日志数据的记录
              operateLogMapper.insert(operateLog);
      
              log.info("AOP记录操作日志", operateLog);
              return result;
          }
      
      }
      
  • 获取当前登录用户
    • 获取request对象,从请求头中获取JWT令牌,解析令牌获取当前用户ID 

到了这里,关于AOP案例-记录日志操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表

    使用FieldMeta自定义注解,看个人业务自行觉得是否需要重新定义实体 实现类 :通过该实现类获取更新前后的数据。 该实现类的实现原理为:获取入参出入的id值,获取sqlSessionFactory,通过sqlSessionFactory获取selectByPrimaryKey()该方法,执行该方法可获取id对应数据更新操作前后的数

    2024年01月23日
    浏览(40)
  • AOP实现日志记录

    AOP实现日志记录 自定义注解方式 实现 1、总体图 2、注解类SystemLog SystemLog 3、切面类LogAspect handleBefore 在 请求执行之前 执行这个方法 handleAfter 在 请求执行之后 执行这个方法 LogAspect 4、测试 运行项目,访问 @PutMapping(“/user/userInfo”) 即可打印日志信息。 这个请求之前的日志

    2024年02月14日
    浏览(29)
  • Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

    开篇: 欢迎再次来到 Spring 5 学习系列!在这个博客中,我们将深入研究 Spring 框架的AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式)。 概念 什么是AOP (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的

    2024年01月24日
    浏览(37)
  • 使用Spring Boot AOP实现日志记录

    目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目,无需选择依赖 2.2 设置好本地Maven配置后,在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务  2.5 在单元测试运行结果 2.6 创建切面类 2.7 再次运行测试  总结 1.

    2024年02月14日
    浏览(44)
  • P02项目诊断报警组件(学习操作日志记录、单元测试开发)

    ★ P02项目诊断报警组件 诊断报警组件的主要功能有: 接收、记录硬件设备上报的报警信息。 从预先设定的错误码对照表中找到对应的声光报警和蜂鸣器报警策略,结合当前的报警情况对设备下发报警指示。 将报警消息发送到消息队列,由其它组件发送给前端。 从消息队列

    2024年02月04日
    浏览(34)
  • 开闭原则正确姿势, 使用AOP优雅的记录日志, 非常的哇塞

    👳我亲爱的各位大佬们好😘😘😘 ♨️ 本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️ 如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛 👨‍🔧 个人主页 : 阿千弟 🔥

    2024年02月06日
    浏览(26)
  • Selenium获取本地已打开的浏览器页面进行跟踪和自定义日志记录

    本操作只是打基本的核心代码写清楚,基础环境配置和原理 参考Selenium 参考Selenium自动化获取WebSocket信息 - 走看看

    2024年02月16日
    浏览(47)
  • Spring Boot入门(23):记录接口日志再也不难!用AOP和自定义注解给Spring Boot加上日志拦截器!

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(44)
  • java web(后端+前端) 学习路线记录---1.Java(更新中)

    资源:狂神说 1.注释、标识符、 (1) 建立空项目来建立java项目: (2) 单行注释://注释 (3) 多行注释:/* Djandjan / (4) 文档注释: / * */ 2标识符(类名,变量名,方法名) (5) (6) 标识符注意点: 2.数据类型 (1) 要求变量严格符合规范,所有变量先

    2024年02月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包