通过自定义注解和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 版权协议,转载请附上原文出处链接和本声明。