使用spring的AOC切面可以实现日志的记录。
private final OperaLogManagement operaLogManagement;
public OperaLogAspect(OperaLogManagement operaLogManagement) {
this.operaLogManagement = operaLogManagement;
}
/** @annotation:用于匹配当前执行方法持有指定注解的方法
* 接口OperaLog路径
* */
@Pointcut("@annotation(com.sjr.operalog.OperaLog)")
public void operaLogPointCut(){};
@AfterReturning(value = "operaLogPointCut()")
public void dealOperaLog(JoinPoint point){
/**
* 获取RequestAttributes
* RequestContextHolder.getRequestAttributes()可以在service或其他层获取HttpServletRequest
* 可以从request中获取ip地址
*/
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
OperaLogDto operaLogDto = new OperaLogDto();
try {
operaLogDto.setIp(UUID.randomUUID().toString());
// 从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) point.getSignature();
// 获取切入点所在的方法
Method method = signature.getMethod();
OperaLog operaLog = method.getAnnotation(OperaLog.class);
if (operaLog != null){
operaLogDto.setOperaMoudel(operaLog.operaModel());
operaLogDto.setDescription(operaLog.operaDesc());
}
operaLogDto.setId("");
operaLogDto.setAddress("");
operaLogManagement.saveOperaLog(operaLogDto);
} catch (Exception e) {
e.printStackTrace();
}
}