转:http://www.iteedu.com/arch/audit/aopaudit.htm
审计一般要记录用户访问了哪个功能,参数是什么,用于找出用户干了什么事。
今天看了一个比较好的方法,用JAVA注解和AOP实现审计功能。
使用方法
在要审计的方法上加上JAVA注解SysLog
@SysLog("新增系统用户")
public Result save(@RequestBody UserEntity user){
userService.save(user);
return Result.ok();
}
注解SysLog
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
关键的AOP实现
把切入各项要记录的信息收集到,插入数据库,为了效率也可以异步放入MQ慢慢处理,都可以。
@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);
}
}