【組件】如何用AOP實現功能審計

審計一般要記錄用戶訪問了哪個功能,參數是什么,用于找出用戶干了什么事。

今天看了一個比較好的方法,用JAVA注解和AOP實現審計功能。

使用方法

在要審計的方法上加上JAVA注解SysLog

1
2
3
4
5
@SysLog("新增系統用戶")
public Result save(@RequestBody UserEntity user){
userService.save(user);
return Result.ok();
}

注解SysLog

1
2
3
4
5
6
7
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

String value() default "";
}

關鍵的AOP實現

把切入各項要記錄的信息收集到,插入數據庫,為了效率也可以異步放入MQ慢慢處理,都可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;

@Pointcut("@annotation(com.xxxxxx.SysLog)")
public void logPointCut() {

}

@Before("logPointCut()")
public void saveSysLog(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();

SysLogEntity sysLog = new SysLogEntity();
SysLog syslog = method.getAnnotation(SysLog.class);
if(syslog != null){
//注解上的描述
sysLog.setOperation(syslog.value());
}

//請求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");

//請求的參數
Object[] args = joinPoint.getArgs();
if(args.length>0){
String params = JSON.toJSONString(args[0]);
sysLog.setParams(params);
}

//獲取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//設置IP地址
sysLog.setIp(IPUtils.getIpAddr(request));

//用戶名
String username = ShiroUtils.getUserEntity().getUserName();

sysLog.setUsername(username);

sysLog.setCreateDate(new Date());
//保存系統日志
sysLogService.save(sysLog);
}

}
体彩25选5走势图