相关文章:
SpringBoot 之AOP切面的使用
SpringBoot之Listener注册到Spring容器中的多种方法
SpringBoot之Filter过滤器的实现及排序问题
SpringBoot 之多个过滤器(Filter) ,监听器(Listener),切面(AOP),拦截器(Interceptor)的指定排序问题总结篇

springboot中实现拦截器方式

实现方式

实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter 抽象类

两者区别

HandlerInterceptorAdapter 实现AsyncHandlerInterceptor接口,AsyncHandlerInterceptor接口 继承HandlerInterceptor接口。AsyncHandlerInterceptor接口多了一个afterConcurrentHandlingStarted方法

创建一个拦截器实现HandlerInterceptor接口

在jdk1.8之后,只需要实现自己需要的方法。因为接口有默认实现。

@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("方法开始前拦截.........");//业务代码 返回false或者truereturn false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("方法返回后拦截.........");}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("方法结束后拦截.........");}
}

创建一个拦截器继承HandlerInterceptorAdapter类

@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("方法开始前拦截.........");//业务代码 返回false或者truereturn false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("方法返回后拦截.........");}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("方法结束后拦截.........");}/*** 如果返回一个current类型的变量,会启用一个新的线程。执行完preHandle方法之后立即会调用afterConcurrentHandlingStarted,然后新线程再以次执行*/@Overridepublic void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("do something.........");super.afterConcurrentHandlingStarted(request, response, handler);}
}

创建配置类来管理拦截器,并将之前的拦截器注入其中

两种方式,实现 WebMvcConfigurer 或者继承 WebMvcConfigurationSupport 两者没什么区别,看项目的选择。

@Configuration
public class MvcInterceptorConfig extends WebMvcConfigurationSupport {@Autowiredprivate LoginInterceptor loginInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则,/**表示拦截所有请求// excludePathPatterns 用户排除拦截registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register");  }
}

多个拦截器执行顺序

多个拦截器的执行顺序按照你的代码代码添加顺序,先添加后执行。

在未设置order方法值时:

registry.addInterceptor(repeatPutInterceptor) // 1
registry.addInterceptor(refererInterceptor) // 2
registry.addInterceptor(loginAuthInterceptor) //3

针对于preHandle 执行顺序为:1->2->3
针对于postHandle执行顺序为:3->2->1
针对于afterCompletion执行顺序为:3->2->1

设置order值时:此时能实现自定义顺序

registry.addInterceptor(repeatPutInterceptor).order(1) // 1
registry.addInterceptor(loginAuthInterceptor).order(3) //2
registry.addInterceptor(refererInterceptor).order(2) // 3

针对于preHandle 执行顺序为:1->3->2
针对于postHandle执行顺序为:2->3->1
针对于afterCompletion执行顺序为:2->3->1

源码出处:InterceptorRegistry类

protected List<Object> getInterceptors() {return this.registrations.stream().sorted(INTERCEPTOR_ORDER_COMPARATOR).map(InterceptorRegistration::getInterceptor).collect(Collectors.toList());
}
private static final Comparator<Object> INTERCEPTOR_ORDER_COMPARATOR =OrderComparator.INSTANCE.withSourceProvider(object -> {if (object instanceof InterceptorRegistration) {return (Ordered) ((InterceptorRegistration) object)::getOrder;}return null;});

排序问题

添加@order注解,和实现Ordered 接口都无法实现自定义顺序的。只能在配置类中注入拦截器的时候添加order或者使用代码顺序来自定义排序

SpringBoot之Interceptor拦截器注入使用相关推荐

  1. 【SpringBoot】解决拦截器注入 Service 为空问题

    一.自定义拦截器实现 HandlerInterceptor 接口 /*** * Created by zhh on 2018/04/20.*/ public class MyInterceptor i ...

  2. 【Java代码】使用 org.apache.ibatis.plugin.Interceptor 拦截器实现全局 mapper.xml 参数注入(可用于切换数据库实例schema+Demo举例源码)

    1. why   项目没有使用MyBatis,进行数据操作时使用的是jdbc中默认的schema,现在项目要加入多租户,同一个数据库下不同租户使用不同的实例schema,这就要在mapper文件内所有 ...

  3. springboot Interceptor拦截器excludePathPatterns失效

    springboot Interceptor拦截器excludePathPatterns失效 使用jwt和HandlerInterceptorAdapter做登录的拦截放行失效,其实更多时候不是配置文 ...

  4. springboot 自定义注解拦截器

    springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...

  5. SpringBoot中配置拦截器时,跨域失效

    SpringBoot中配置拦截器时,跨域失效 前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求. @Con ...

  6. springMVC之Interceptor拦截器

    转自:https://blog.csdn.net/qq_25673113/article/details/79153547 Interceptor拦截器用于拦截Controller层接口,表现形式有点 ...

  7. interceptor拦截器典型应用实例----数据稽核

    interceptor拦截器典型应用实例----数据稽核 Interceptor拦截器的使用小结,程序实例是典型的 "数据稽核"过程,即在对数据库中的数据进行修改后会自动添加对应的 ...

  8. 框架:SpringMVC中Interceptor拦截器的两种实现

    Spring中使用Interceptor拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证, ...

  9. spring拦截器覆盖_Spring中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

最新文章

  1. Go if _,ok:=range map; ok判断key是否在map中
  2. 赢在CSDN —— 我们一起向前
  3. 机器学习之凸优化原理推导及相关知识总结
  4. php容器概念,深入thinkphp5.1之Container容器
  5. (转)使用C#开发ActiveX控件
  6. 机器学习5-支持向量机
  7. VS2018 查看类图 安装-属性,快捷键
  8. AN APPROACH OF VECTOR FIELD TEXTURE VISUALIZATION BASED ON FIELD DRIVEN STRENGTH算法实现
  9. jcp jsr_JCP EC 2011年特别选举结果即将公布!
  10. 80x86系统微处理器简介
  11. canvas实现矩形框,用来进行图片框选
  12. office2021下载|office2021安装包配置过程图文教程
  13. matlab坐标值旋转平移
  14. Silverlight教程第五部分:用 ListBox 和 DataBinding 显示列表数据 (木野狐译)
  15. 阴阳师双拉条怎么不被超车
  16. 中科院博士论文致谢部分走红,感动无数网友,其实沉下心来,你我何尝不是前程万里
  17. Windows Server 2016-Nano Server介绍
  18. vsCode 打开界面报错,尝试在目标目录创建文件时发生一个错误
  19. cad在线转低版本_CAD这些技巧你还不会怎么当大神
  20. win10操作系统如何进行局域网文件共享

热门文章

  1. python如何识别中文_python如何识别图片中的文字
  2. android真实项目教程(一)——App应用框架搭建_by_CJJ
  3. 26期20180615磁盘格式化挂载以及手动增加swap空间
  4. Mysql Grant 用户权限总结(详细编)
  5. 全球以太网交换机和路由器市场:谁领跑?
  6. Android基础知识点的整理3
  7. Spark成为大数据高手进阶步骤
  8. 利用Civil 3D API更改曲面的样式
  9. Kubernetes 的CRI-O容器引擎中存在严重漏洞
  10. 他们从各大操作系统中发现了26个 USB 漏洞,用的是这款模糊测试工具