AOP操作日志方案设计
1.添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 操作日志注解类
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface OperateLog {
OperateTypeEnum operateType() default OperateTypeEnum.OTHER;
String operateDesc() default " ";
}
3. 操作类型枚举类
public enum OperateTypeEnum {
LOGIN, LOGOUT, OFFLINE, ONLINE, OTHER;
}
4. 切面类记录操作日志
@Aspect
@Component
public class OperateLogAspect {
@Pointcut("@annotation(OperateLog)")
public void operateLogPointCut() {
}
@AfterReturning(value = "operateLogPointCut()", returning = "keys")
public void saveOperateLog(JoinPoint joinPoint, Object keys) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
try {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
OperateLog operateLog = method.getAnnotation(OperateLog.class);
if (!Objects.isNull(operateLog)) {
String operateType = operateLog.operateType().name();
System.out.println("operateType = " + operateType);
}
String className = joinPoint.getTarget().getClass().getName();
String methodName = method.getName();
methodName = className + "." + methodName;
String params = JSON.toJSONString(parsingParam(joinPoint, signature, method));
String returnResultParam = JSON.toJSONString(keys);
System.out.println("request param : " + params + ", return result param : " + returnResultParam);
} catch (Exception e) {
e.printStackTrace();
}
}
private Map<String, Object> parsingParam(JoinPoint joinPoint, MethodSignature signature, Method method) {
Object[] args = joinPoint.getArgs();
ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
Map<String, Object> paramMap = new HashMap<>(32);
if (!Objects.isNull(parameterNames)) {
for (int i = 0; i < parameterNames.length; i++) {
paramMap.put(parameterNames[i], args[i]);
}
}
return paramMap;
}
}