转:Spring Boot中使用AOP统一处理Web请求日志

在spring boot中,简单几步,使用spring AOP实现一个拦截器:

1、引入依赖:

[html] view plain copy
 
 
在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.     <groupId>org.springframework.boot</groupId>  
  3.     <artifactId>spring-boot-starter-aop</artifactId>  
  4. </dependency>  
[html] view plain copy
 
  1. <dependency>  
  2.      <groupId>org.springframework.boot</groupId>  
  3.      <artifactId>spring-boot-starter-aop</artifactId>  
  4.  </dependency>  


2、创建拦截器类(在该类中,定义了拦截规则:拦截com.xjj.web.controller包下面的所有类中,有@RequestMapping注解的方法。):

[java] view plain copy
 
 
在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 拦截器:记录用户操作日志,检查用户是否登录…… 
    3.  * @author XuJijun 
    4.  */  
    5. @Aspect  
    6. @Component  
    7. public class ControllerInterceptor {  
    8.     private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class);  
    9.       
    10.     @Value(“${spring.profiles}”)  
    11.     private String env;  
    12.       
    13.     /** 
    14.      * 定义拦截规则:拦截com.xjj.web.controller包下面的所有类中,有@RequestMapping注解的方法。 
    15.      */  
    16.     @Pointcut(“execution(* com.xjj.web.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)”)  
    17.     public void controllerMethodPointcut(){}  
    18.       
    19.     /** 
    20.      * 拦截器具体实现 
    21.      * @param pjp 
    22.      * @return JsonResult(被拦截方法的执行结果,或需要登录的错误提示。) 
    23.      */  
    24.     @Around(“controllerMethodPointcut()”) //指定拦截器规则;也可以直接把“execution(* com.xjj………)”写进这里  
    25.     public Object Interceptor(ProceedingJoinPoint pjp){  
    26.         long beginTime = System.currentTimeMillis();  
    27.         MethodSignature signature = (MethodSignature) pjp.getSignature();  
    28.         Method method = signature.getMethod(); //获取被拦截的方法  
    29.         String methodName = method.getName(); //获取被拦截的方法名  
    30.           
    31.         Set<Object> allParams = new LinkedHashSet<>(); //保存所有请求参数,用于输出到日志中  
    32.           
    33.         logger.info(”请求开始,方法:{}”, methodName);  
    34.           
    35.         Object result = null;  
    36.   
    37.         Object[] args = pjp.getArgs();  
    38.         for(Object arg : args){  
    39.             //logger.debug(“arg: {}”, arg);  
    40.             if (arg instanceof Map<?, ?>) {  
    41.                 //提取方法中的MAP参数,用于记录进日志中  
    42.                 @SuppressWarnings(“unchecked”)  
    43.                 Map<String, Object> map = (Map<String, Object>) arg;  
    44.   
    45.                 allParams.add(map);  
    46.             }else if(arg instanceof HttpServletRequest){  
    47.                 HttpServletRequest request = (HttpServletRequest) arg;  
    48.                 if(isLoginRequired(method)){  
    49.                     if(!isLogin(request)){  
    50.                         result = new JsonResult(ResultCode.NOT_LOGIN, “该操作需要登录!去登录吗? (不知道登录账号?请联系老许。)”, null);  
    51.                     }  
    52.                 }  
    53.                   
    54.                 //获取query string 或 posted form data参数  
    55.                 Map<String, String[]> paramMap = request.getParameterMap();  
    56.                 if(paramMap!=null && paramMap.size()>0){  
    57.                     allParams.add(paramMap);  
    58.                 }  
    59.             }else if(arg instanceof HttpServletResponse){  
    60.                 //do nothing…  
    61.             }else{  
    62.                 //allParams.add(arg);  
    63.             }  
    64.         }  
    65.           
    66.         try {  
    67.             if(result == null){  
    68.                 // 一切正常的情况下,继续执行被拦截的方法  
    69.                 result = pjp.proceed();  
    70.             }  
    71.         } catch (Throwable e) {  
    72.             logger.info(”exception: ”, e);  
    73.             result = new JsonResult(ResultCode.EXCEPTION, “发生异常:”+e.getMessage());  
    74.         }  
    75.           
    76.         if(result instanceof JsonResult){  
    77.             long costMs = System.currentTimeMillis() - beginTime;  
    78.             logger.info(”{}请求结束,耗时:{}ms”, methodName, costMs);  
    79.         }  
    80.           
    81.         return result;  
    82.     }  
    83.       
    84.     /** 
    85.      * 判断一个方法是否需要登录 
    86.      * @param method 
    87.      * @return 
    88.      */  
    89.     private boolean isLoginRequired(Method method){  
    90.         if(!env.equals(“prod”)){ //只有生产环境才需要登录  
    91.             return false;  
    92.         }  
    93.           
    94.         boolean result = true;  
    95.         if(method.isAnnotationPresent(Permission.class)){  
    96.             result = method.getAnnotation(Permission.class).loginReqired();  
    97.         }  
    98.           
    99.         return result;  
    100.     }  
    101.       
    102.     //判断是否已经登录  
    103.     private boolean isLogin(HttpServletRequest request) {  
    104.         return true;  
    105.         /*String token = XWebUtils.getCookieByName(request, WebConstants.CookieName.AdminToken); 
    106.         if(“1”.equals(redisOperator.get(RedisConstants.Prefix.ADMIN_TOKEN+token))){ 
    107.             return true; 
    108.         }else { 
    109.             return false; 
    110.         }*/  
    111.     }  
    112. }  
奔跑吧..骄傲的少年!
原文地址:https://www.cnblogs.com/jinloooong/p/7284584.html