我想了解用拦截器记录操作日志的实现代码
时间: 2024-02-21 12:57:50 浏览: 22
好的,以下是一个使用拦截器记录操作日志的实现代码示例:
```java
@Component
@Aspect
public class LogInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);
@Autowired
private LogService logService;
@Autowired
private HttpServletRequest request;
@Pointcut("execution(* com.example.controller.*.*(..))")
public void pointCut() {}
@Before("pointCut()")
public void doBefore(JoinPoint joinPoint) {
String username = (String) request.getSession().getAttribute("username");
if (username == null) {
username = "anonymous";
}
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getTarget().getClass().getSimpleName();
String params = Arrays.toString(joinPoint.getArgs());
LOGGER.info("User {} accessed {}.{}, with parameters {}", username, className, methodName, params);
}
@AfterReturning(pointcut = "pointCut()", returning = "returnValue")
public void doAfterReturning(JoinPoint joinPoint, Object returnValue) {
String username = (String) request.getSession().getAttribute("username");
if (username == null) {
username = "anonymous";
}
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getTarget().getClass().getSimpleName();
String params = Arrays.toString(joinPoint.getArgs());
String returnValueString = returnValue == null ? "" : returnValue.toString();
LOGGER.info("User {} accessed {}.{}, with parameters {}, and returned value {}", username, className, methodName, params, returnValueString);
// 保存操作日志到数据库
Log log = new Log();
log.setUsername(username);
log.setClassName(className);
log.setMethodName(methodName);
log.setParams(params);
log.setReturnValue(returnValueString);
logService.save(log);
}
}
```
这是一个使用 Spring AOP 实现的拦截器,通过 @Pointcut 注解指定需要拦截的方法,然后在方法执行前和执行后分别记录日志和保存操作日志到数据库中。其中,日志记录使用了 slf4j + logback 的组合,可以根据需要进行配置。
需要注意的是,这里使用了 HttpServletRequest 对象获取当前用户的信息,如果你的项目中没有使用 Spring MVC 或者类似的框架,可以通过其他方式获取用户信息。此外,这里的 LogService 是一个自定义的服务类,需要根据自己的实际情况进行定义和实现。