在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. 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.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. 识别手写数字增强版100% - pytorch从入门到入道(一)

    手写数字识别,神经网络领域的“hello world”例子,通过pytorch一步步构建,通过训练与调整,达到“100%”准确率 1.快速开始 1.1 定义神经网络类,继承torch.nn.Modul ...

  2. MapReduce任务提交源码分析

    为了测试MapReduce提交的详细流程.需要在提交这一步打上断点: F7进入方法: 进入submit方法: 注意这个connect方法,它在连接谁呢?我们知道,Driver是作为客户端存在的,那么客 ...

  3. 如何在HTML中设置字体颜色,你知道这几种方式吗?

    color设置字体颜色 在color设置字体颜色之前,我们首先了解color在CSS中有几种取值方式,一共有4种方式,若有不全还请在评论区告知谢谢,4种方式如下: 十六进制.十进制. 英文单词.十六进 ...

  4. 130道ASP.NET面试题(一)

    1 .简述 private,protected,public,internal修饰符的访问权限 答: private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部 ...

  5. Jenkins + docker ,容器中跑docker服务

    1. 宿主机:安装docker 2. 启动jenkins服务 https://jenkins.io/download/ Jenkins官网找自己需要的镜像版本号进行使用. docker run -it ...

  6. ReentrantLock 如何实现非公平锁?和公平锁实现有什么区别

    reentrant 英[riːˈɛntrənt] 美[ˌriˈɛntrənt] 先学会读.单词原意是可重入的 考察显示锁的使用.可延伸知识点 独占锁 & 共享锁 独占锁 - 悲观锁(不能同时被 ...

  7. vue 封装方法

    个我这个是局部引入方法,下次有需要全局在补上(全局:在main.js文件引入封装的方法js文件,然后用Vue.prototype) 一.新建一个js文件loading.js 二.编辑loading.j ...

  8. scrapy_redis分布式爬虫

    文章来源:https://github.com/rmax/scrapy-redis Scrapy-Redis Documentation: https://scrapy-redis.readthedo ...

  9. PHP 核心特性之匿名函数

    提出 在匿名函数出现之前,所有的函数都需要先命名才能使用 1 2 3 4 5 function increment($value) {     return $value + 1; } array_m ...

  10. Golang 指针理解

    目录 0x00 指针地址和指针类型 0x01 从指针获取指针指向的值 0x02 使用指针修改值 0x03 返回函数中局部变量 0x04 使用 new() 创建指针 0x05 flag包的指针技术 0x ...