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

时间:2022-09-10 11:37:51

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

1、引入依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

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

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

转:Spring Boot中使用AOP统一处理Web请求日志的更多相关文章

  1. 46&period; Spring Boot中使用AOP统一处理Web请求日志

    在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...

  2. Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  3. (转)Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  4. Springboot中使用AOP统一处理Web请求日志

    title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...

  5. SpringBoot2&period;0 使用AOP统一处理Web请求日志(完整版)

    一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  6. spring Boot使用AOP统一处理Web请求日志记录

    1.使用spring boot实现一个拦截器 1.引入依赖: <dependency>   <groupId>org.springframework.boot</grou ...

  7. AOP统一处理Web请求日志

    <!--aop--> <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  8. springboot Aop 统一处理Web请求日志

    1.增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  9. Spring Boot中使用AOP记录请求日志

    这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...

随机推荐

  1. Save matrix to a txt file - matlab 在matlab中将矩阵变量保存为txt格式

    Source: Baidu Wenku % Original code has been modified dirMain = 'D:\test\'; fid = fopen([dirMain, 't ...

  2. mysql 命令行操作1

    查看版本号 :SELECT @@version;或者status; 1.设置数据库系统的事务隔离级别 mysql> set global transaction isolation level ...

  3. kubernetes听云实战发布版

    ➠更多技术干货请戳:听云博客 听云线上使用k8s已经有一段时间了,下面对一些听云使用过程中的问题进行一些梳理,包括架构设计,安装部署和后期维护. 目录结构如下: 下面进入正题: 我们以听云系统的一个报 ...

  4. SVN功能详解

    SVN功能详解   TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...

  5. HTTP协议介绍&lpar;SERVLET&rpar;

    本文是servlet的入门篇,主要简单介绍下http协议 1.什么是HTTP _ 1.http协议:_1. 复杂解释:   http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议 ...

  6. feature2d相关

    1.Harris角点检测 是基于灰度图像的角点检测. 灰度变化率函数如下: 其中的w(x,y)为加权函数,可为常数或为高斯函数.之后对E(u,v)进行泰勒级数的展开与化简,最终得到 ,,Ix,Iy是图 ...

  7. phpcms ——模板标签详细使用说明

    使用phpcms总是要查询各种标签,实在很烦,只好找个比较全的来备查.因为自己写一个orm来配合调用也没那么容易无缝的嵌入到引擎当中. 获取父分类下面的子分类 {loop subcat(77) $k ...

  8. 关于read的例子和条件测试

    1.关于read比较两个的大小 #!/bin/sh read -t -p "please input two num:" a b if [ $a -gt $b ]; then ec ...

  9. Eclipse CDT开发环境搭建及问题记录(Windows)

    这两天在整Eclipse,在此记录过程中遇到的一些问题. 1.安装JDK,配置系统路径: 2.下载Eclipse 直接访问Eclipse官网(https://www.eclipse.org/downl ...

  10. out对象

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...