通过自定义注解和AOP实现拦截接口调用记录日志

  • Post author:
  • Post category:其他


通过自定义注解和AOP实现拦截接口调用记并录日志




前言


实现其实很简单,分为三步,首先自定义一个注解,然后写一个拦截器类,再在想要拦截的接口上加上注解。




一、自定义注解


代码如下:

import org.springframework.stereotype.Component;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Component
public @interface SysLog {

    String value() default ""; // 示例:修改密码

    String path() default ""; // 示例:/sys/user/updayePwd
}



二、编写拦截器


代码如下:

import com.alibaba.fastjson.JSON;

@Aspect
@Component
public class SysLogInterceptor {

    @Pointcut("@annotation(com.test.annotation.SysLog)")
    public void execute() {}

    @Around("execute()")
    Object around(ProceedingJoinPoint pj) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Object object = pj.proceed(pj.getArgs());   
        Long executeTime = System.currentTimeMillis() - beginTime; // 执行时长(毫秒)
        String interfaceParams = JSON.toJSONString(pj.getArgs()); // 接口入参
        String result = JSON.toJSONString(object);// 接口返回结果
        String interfaceCode = methodSignature.getName();// 接口名称
        MethodSignature methodSignature = (MethodSignature)pj.getSignature();
        Method targetMethod = methodSignature.getMethod();
        SysLog sysLog = targetMethod.getAnnotation(SysLog.class); // 从接口注解中获取注解信息
        String interfaceName = sysLog.value(); // 接口中文名称
        String interfacePath = sysLog.path(); // 接口路径
        // 建一张表,调用持久化服务存储日志,上述写的信息都可以存储到表中
        
        return object;
    }

    @AfterThrowing(value = "execute()",throwing = "runtimeException")
    public void afterThrowingAdvice(JoinPoint pj, RuntimeException runtimeException){
        System.out.println(pj);
        // 接口调用后异常处理
    }
}



三、在接口上加上注解


代码如下:

    @PostMapping("/test")
    @SysLog(value = "我是接口中文描述", path = "/mytest/test")
    public Map<String, Object> test(@RequestBody Map<String, Object> params) {
        // 接口具体调用,此处是示例,啥也不做,直接返回参数
        return params;
    }



总结


利用自定义注解和aop记录日志的简单实现如上述代码,思路是首先自定义一个注解,然后在想要拦截的接口用自定义注解标注(可以在注解上附带增加一些描述信息),接着编写拦截器类,并以该注解为切点进行拦截,最后在拦截器中提取接口的调用信息,并写入库中。



版权声明:本文为qq_27302871原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。