当前位置: 首页 > news >正文

转: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, “该操作需要登录!去登录吗?\n\n(不知道登录账号?请联系老许。)”, 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

相关文章:

  • 《零基础入门学习Python》学习过程笔记【38类的继承】
  • 制作毛玻璃效果
  • 设计模式——简单工厂模式
  • 吐血分享:QQ群霸屏技术教程(接单篇)
  • js全局变量,局部变量
  • 2017百度之星资格赛 1003 度度熊与邪恶大魔王 背包DP
  • 8086汇编之 CALL 和 RET指令
  • c# 多线程编程中AutoResetEvent和ManualResetEvent
  • 【Python】 配置文件相对路径软件自动执行的工作目录
  • [SDUT](3361) 数据结构实验之图论四:迷宫探索 ---DFS(图)
  • proxy汇总-1
  • 使用for循环输出九九乘法表
  • ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件
  • 安装node.js和npm
  • 推荐几款谷歌浏览器的使用插件
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 30秒的PHP代码片段(1)数组 - Array
  • angular组件开发
  • JavaScript-Array类型
  • JavaScript对象详解
  • Js基础知识(四) - js运行原理与机制
  • Lsb图片隐写
  • Markdown 语法简单说明
  • Python socket服务器端、客户端传送信息
  • Redis中的lru算法实现
  • swift基础之_对象 实例方法 对象方法。
  • Vim 折腾记
  • Vue UI框架库开发介绍
  • ------- 计算机网络基础
  • 简单易用的leetcode开发测试工具(npm)
  • 理清楚Vue的结构
  • 力扣(LeetCode)357
  • 马上搞懂 GeoJSON
  • 嵌入式文件系统
  • 深入浏览器事件循环的本质
  • 手写一个CommonJS打包工具(一)
  • 算法之不定期更新(一)(2018-04-12)
  • 一些css基础学习笔记
  • 06-01 点餐小程序前台界面搭建
  • MPAndroidChart 教程:Y轴 YAxis
  • Python 之网络式编程
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (C语言)fgets与fputs函数详解
  • (Forward) Music Player: From UI Proposal to Code
  • (function(){})()的分步解析
  • (Git) gitignore基础使用
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (多级缓存)缓存同步
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)80c52学习之旅-起始篇
  • (一)RocketMQ初步认识