我遇到个需求,给每个人做操作记录,记录是另一个服务,往数据库里插入记录日志。但是并不是所有的操作都要加记录。所以这里涉及到注解。在你需要的接口前加一个注解,就可以记录这个操作。
注解其实就是一个类,可以定义在接口上,然后在拦截器里根据这个类的值进行判断,这是最常用的方法。
OperLog日志类
package com.dengtacj.tanzhiw.virtualhuman.config;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @version 1.0
* @Description 操作日志记录
* @Date 2024/1/11
* @return
**/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface OperLog {
//日志操作
String nameOper() default "";
}
在拦截器里面的加
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//验证方法 (这是你以前拦截的)
....
//如果认证通过,则进行日志记录
if(method.isAnnotationPresent(OperLog.class)){
String token = request.getHeader("Authorization");
if(token==null){
System.out.println("不进行日志记录,因为token为null");
}else{
//日志记录
OperLog operLog = method.getAnnotation(OperLog.class);
System.out.println("目前operLog操作值是"+operLog.nameOper());
System.out.println("目前token的值是"+token);
发送post请求记录日志...
}
}
? ? ? ? 在被调用的接口加,我在查询接口上写例子
@OperLog(nameOper = "查询克隆音")
@RequestMapping(value = "/reader/clone/list", method = {RequestMethod.POST})
public CommonResult<PageInfo<LiveUserTrainReaderEntity>> cloneList(HttpServletRequest request, @RequestBody CommAppPagePo po) {
try {
return CommonResult.success(liveUserTrainReaderService.getByUserId(po));
} catch (Exception e) {
logger.error("Exception:", e);
return CommonResult.failed();
}
}
然后我们调用这个接口,测试
成功