需求
对于页面关键操作进行日志记录
实现方式:自定义注解+AOP
- 引入aop包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 自定义注解
package com.example.shiro.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLogs {
/**
* 可以根据具体的需要添加对应的参数
* @return
*/
- AOP
package com.example.shiro.aspect;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Configuration
public class LogAspect {
private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
// 定义切点Pointcut
@Pointcut("@annotation(com.example.shiro.annotation.MyLogs)")
public void excudeService() {
}
@Around("excudeService()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String method = request.getMethod();
String uri = request.getRequestURI();
String paraString = JSON.toJSONString(request.getParameterMap());
/**
* 可以将重要日志落入到数据库中,这里仅仅做打印
*/
logger.info("***************************************************");
logger.info("请求开始, URI: {}, method: {}, params: {}", uri, method, paraString);
// result的值就是被拦截方法的返回值
Object result = pjp.proceed(); //执行请求
logger.info("请求结束,controller的返回值是 " + JSON.toJSONString(result));
return result;
}
}
- 测试结果