Java使用Aop实现用户操作日志记录(新手入门)

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

  1. 导入打印日志,aop,hutool,的依赖,Hutool是一个Java工具包,里面封装了大量的常用工具类,到时候咱们就通过这个工具包中有一个工具类可以用来获取客户端IP地址。
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.6.3</version>
    </dependency>
  2. 自定义操作类型枚举类 因为基本是增删改查四个方法
    /**
     * 操作类型枚举类
     * @author lichuan
     */
    public enum OperationTypeEnum {
    
        /**
         * 新增操作
         */
        INSERT("新增"),
        /**
         * 修改操作
         */
        UPDATE("修改"),
        /**
         * 删除操作
         */
        DELETE("删除"),
        /**
         * 查询操作
         */
        QUERY("查询"),
        /**
         * 其它
         */
        OTHER("其它");
    
        private String operationType;
    
        OperationTypeEnum(String operationType) {
            this.operationType = operationType;
        }
    
        public String getOperationType() {
            return operationType;
        }
    }
  3. 自定义用来记录用户操作日志的注解
    @Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
    @Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
    @Documented
    public @interface OperationLog {
    
        /**
         * 操作模块
         * @return
         */
        String operationModule() default "";
    
        /**
         * 操作类型
         * @return
         */
        OperationTypeEnum operationType() default OperationTypeEnum.OTHER;
    
        /**
         * 操作说明
         * @return
         */
        String description() default "";
    
    
    }
  4. 写一个方法加上我们自定义的注解
    Java使用Aop实现用户操作日志记录(新手入门)
  5. 定义用来记录用户操作日志的切面类

 

import cn.hutool.extra.servlet.ServletUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
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.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @author lichuan
 */
@Aspect
@Component
@Slf4j
public class OperationLogAspect {

    /**
     * 设置操作日志切入点,在注解的位置切入代码
     */
    @Pointcut("execution(public * com.tm.controller..*Controller.*(..))")
    public void operationLogPointCut() {
    }

    /**
     * 定义环绕通知
     * 1. 环绕通知需要携带ProceedingJoinPoint类型的参数
     * 2. 环绕通知类似于动态代理的全过程ProceedingJoinPoint类型的参数可以决定是否执行目标方法
     * 3. 且环绕通知必须有返回值,返回值即目标方法的返回值
     */
    @Around("operationLogPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) {

        Object result = null;
        //获取系统当前时间毫秒值
        long beginTime = System.currentTimeMillis();
        log.info("环绕通知开始");
        try {
            //执行目标方法
            result = joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }

        //获取系统当前时间毫秒值
        long endTime = System.currentTimeMillis();

        // 获取RequestAttributes
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

        // 从获取RequestAttributes中获取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
        //获取ip
        String clientIP = ServletUtil.getClientIP(request);
        log.info(clientIP);

        //获取目标方法执行时间
        long usageTime = endTime - beginTime;
      //  operationLogEntity.setUsageTime(usageTime);
        try {
            // 从切面织入点处通过反射机制获取织入点处的方法
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            // 获取切入点所在的方法
            Method method = signature.getMethod();
            //System.out.println(method);
            // 获取操作
            OperationLog operationLog = method.getAnnotation(OperationLog.class);
            if (operationLog != null) {
                log.info(operationLog.operationModule());
                log.info(operationLog.description());
                log.info(operationLog.operationType().getOperationType());
            }
            // 获取请求的类名
            String className = joinPoint.getTarget().getClass().getName();
            // 获取请求的方法名
            String methodName = method.getName();
            methodName = className + "." + methodName;
            log.info(methodName);


            // 请求方法
          //  operationLogEntity.setMethodName(methodName);

            // 请求的参数
            Map<String, String> parameterMap = ServletUtil.getParamMap(request);
            // 将参数所在的数组转换成json
            String requestParams = new ObjectMapper().writeValueAsString(parameterMap);
            // 请求参数
            System.out.println(parameterMap);
            log.info(requestParams);
            // 返回结果
            log.info(new ObjectMapper().writeValueAsString(result));
            // 请求URL
            log.info(request.getRequestURL().toString());
            // 请求URI
            log.info(request.getRequestURI());
            // 创建时间
          //  operationLogEntity.setCreateTime(new Date());
         //   System.out.println(operationLogEntity);
            log.info("环绕通知结束");
        } catch (Exception e) {

        }
        return result;
    }

    /**
     * 转换request 请求参数
     * @param parameterMap request获取的参数数组
     */
    public Map<String, String> convertParameterMap(Map<String, String[]> parameterMap) {
        Map<String, String> convertParameterMap = new HashMap<>();
        for (String key : parameterMap.keySet()) {
            convertParameterMap.put(key, parameterMap.get(key)[0]);
        }
        return convertParameterMap;
    }
}

6.测试

Java使用Aop实现用户操作日志记录(新手入门)

 调用test方法,可以看到控制台已经打印出了日志信息,创建表的对象存入即可文章来源地址https://www.toymoban.com/news/detail-457722.html

到了这里,关于Java使用Aop实现用户操作日志记录(新手入门)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用SpringBoot AOP记录操作日志和异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能;我们在操作某些功 能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 生的异常进行统计,从而改进我们的项目,要

    2024年02月04日
    浏览(35)
  • 使用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)
  • 实现用户操作日志记录

    java自带的日志框架是java.util.logging(JUL),从JDK1.4(2002)开始捆绑在JDK中。可以使用JUL来记录操作日志。以下是使用JUL记录事务的示例: 系统日志 :统日志主要是为开发排查问题提供依据,一般打印在日志文件中;系统日志的可读性要求没那么高,日志中会包含代码的信息

    2024年02月15日
    浏览(31)
  • 使用SpringBoot记录用户操作日志

    在工作中我们可能会遇到一个需求,就是记录用户的操作信息,接下来使用spring的aop特性实现这一需求 一、首先引入我们必要的一些依赖 二、自定义一个注解,用于标注需要监控的方法 三、在数据库中创建一张表,用来保存用户的操作日志 字段可以有  用户名  用户操作

    2024年02月06日
    浏览(37)
  • AOP案例-记录日志操作

    目录 案例 操作日志 思路分析 步骤 准备 编码 将案例中的增删改接口的操作日志记录到数据表中 操作日志 日志信息包括:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时的参数、返回值、犯法运行时长。 思路分析 需要对于所有业务类中的增删改查方法统

    2024年02月09日
    浏览(31)
  • AOP实现日志记录

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

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

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

    2024年02月06日
    浏览(26)
  • 用户登录后IP记录日志的六种实现方案探讨

    之前大群里有小伙伴在讨论用户IP日志记录的一些方案,也有小伙伴在做这个需求,私底下跟我咨询过,所以在此特地汇总梳理一下。 ### 方案1 在登录业务中直接记录用户每次登录的IP日志,如下图所示: 用户请求登录的Controller,原先用户直接调用登录的service,这里假设用

    2024年01月17日
    浏览(32)
  • 一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码) 一张思维导图带你学会Springboot创

    2024年02月13日
    浏览(43)
  • SpringBoot项目如何优雅的实现操作日志记录

    在实际开发当中,对于某些关键业务,我们通常需要记录该操作的内容,一个操作调一次记录方法,每次还得去收集参数等等,会造成大量代码重复。 我们希望代码中只有业务相关的操作,在项目中使用注解来完成此项功能。 通常就是使用Spring中的AOP特性来实现的,那么在

    2024年01月18日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包