spring 拦截器流程 HandlerInterceptor AsyncHandlerInterceptor HandlerInterceptorAdapter

HandlerInterceptor源码

3种方法:

  1. preHandle:拦截于请求刚进入时,进行判断,需要boolean返回值,如果返回true将继续执行,如果返回false,将不进行执行。一般用于登录校验。
  2. postHandle:拦截于方法成功返回后,视图渲染前,可以对modelAndView进行操作。
  3. afterCompletion:拦截于方法成功返回后,视图渲染前,可以进行成功返回的日志记录。
public interface HandlerInterceptor {
    default boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler) throws java.lang.Exception { /* compiled code */ }

    default void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler, @org.springframework.lang.Nullable org.springframework.web.servlet.ModelAndView modelAndView) throws java.lang.Exception { /* compiled code */ }

    default void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler, @org.springframework.lang.Nullable java.lang.Exception ex) throws java.lang.Exception { /* compiled code */ }
}

AsyncHandlerInterceptor源码

jdk 8 以后,接口可以有默认实现,所以,尽量使用 HandlerInterceptor, 适配器模式已经不建议使用了。

public interface AsyncHandlerInterceptor extends org.springframework.web.servlet.HandlerInterceptor {
    default void afterConcurrentHandlingStarted(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler) throws java.lang.Exception { /* compiled code */ }
}
// AsyncHandlerInterceptor中的afterConcurrentHandlingStarted()方法, 会在Controller方法异步执行时开始执行, 但是Interceptor的postHandle()方法则是需要等到Controller的异步执行完之后才能执行

我们只需要继承HandlerInterceptorAdapter,并重写afterCompletion一个方法即可,因为preHandle默认是true

运行流程总结如下:

  1. 拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。
  2. 会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。
  3. 然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。
  4. 在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工作)方法。(postHandle和afterCompletion都是倒序执行)

部分内容借鉴于此博客(表示感谢):https://blog.csdn.net/vincent_duan/article/details/100880498

Original: https://www.cnblogs.com/l-926/p/16224801.html
Author: 小新超人
Title: spring 拦截器流程 HandlerInterceptor AsyncHandlerInterceptor HandlerInterceptorAdapter

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570231/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot教程,吃透这些知识点,超过90%的Java面试者

    动力节点王鹤老师的SpringBoot入门系列课程,通俗易懂,基于SpringBoot2.4版本讲解。 从细节入手,每个事例先讲解pom.xml中的重要依赖,其次applicati…

    Java 2023年6月9日
    050
  • Linux:不分区硬盘挂载

    对硬盘分区相当于windows上的磁盘分区,不影响操作,分区之后能将多个分区挂载多个挂载点。 1 给服务器加装硬盘 查看硬盘是否能够识别,命令 fdisk -l 能够识别到硬盘。 …

    Java 2023年6月7日
    071
  • Netty源码解读(三)-NioEventLoop

    先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,…

    Java 2023年6月16日
    095
  • Java集合归纳总结

    我们讲集合,就是Collection顶级接口下包括的一些常用集合数据结构,大致分为三类:List(可重复元素集)、Map(KV映射集)、Set(不可重复集)、Queue(队列) 总…

    Java 2023年6月5日
    072
  • Java 线程创建与常用方法

    进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、…

    Java 2023年6月9日
    063
  • sanri-tools-maven 企业软件开发工具集

    9420 开发工具包 sanri-tools-maven 是一个开源的用于企业开发的工具包,重点想解决项目开发中一些比较麻烦的问题 根据表和模板生成相应代码;一些身份证,企业代码,…

    Java 2023年6月5日
    094
  • 股票获取最大利润

    1、题目背景 给定一个数组 prices,它的第i个元素prices[i]表示一支给定股票第i天的价格,你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票,设计…

    Java 2023年6月8日
    067
  • 经过一个多月的等待我有幸成为Spring相关项目的Contributor

    给开源项目尤其是 Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的。有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅。 我曾经给 Spring …

    Java 2023年6月8日
    065
  • Java8 中增强 Future:CompletableFuture

    增强的 Future:CompletableFuture CompletableFuture(它实现了 Future 接口) 和 Future 一样,可以作为函数调用的契约。当你向…

    Java 2023年5月29日
    059
  • Kubernetes-Statefulset

    1. 简介 StatefulSet 是用来管理 有状态应用的工作负载A…

    Java 2023年6月7日
    082
  • 消息的种类与消息队列的处理方式

    消息的种类 1.1 按照发送的特点分 同步消息 异步消息 单向消息 举例: 同步消息 我去小吃店要了一套煎饼果子,在门口等了十分钟,煎饼果子好了老板告诉我让我取餐。 异步消息 我去…

    Java 2023年6月14日
    084
  • 消息队列-RabbitMQ的交换机和队列配置

    rabbitmq创建了指定name的交换机后,不允许对其进行改变,否则会报错。 类似报错信息请查看链接:https://www.cnblogs.com/wang-yaz/p/109…

    Java 2023年5月30日
    0157
  • spring boot jdbctemplate queryforstream 使用问题

    开发一个功能为了避免内存问题,使用了 jdbctemplate queryforstream,同时日常中会使用链接池,运行一段时间会出现链接超时的问题 参考示例代码 @RestCo…

    Java 2023年5月30日
    079
  • 产品经理必懂得技术那点事儿——读书笔记

    产品经理 必懂得技术那点事儿 1.产品思维与技术思维 1.1.产品经理为什么要懂技术 当产品经理与工程师就某一个具体问题进行讨论时,双方站在各自角度就问题进行分析和讨论,固有知识结…

    Java 2023年6月16日
    070
  • 姜还是老的辣,看看老战哥的老底儿和老道

    上周日,2022年8月7日,参加了一场久违的半马。中伏天的傍晚,热度不减,全程挥汗如雨,虽不是PB,但也算尽力。晒一下战绩。 支付宝安全发这个通道要对接,今天上午10点,产品经理跟…

    Java 2023年6月15日
    067
  • spring boot RocketMQ 集成

    RocketMQ学习 1.基本概念 RocketMQ是阿里巴巴团队使用java语言开发的一款分布式消息中间件,是一款低延迟,高可用,拥有海量消息堆积能力和灵活拓展性的消息队列。 r…

    Java 2023年6月5日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球