IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringMVC出现多个拦截器时候的拦截情况 -> 正文阅读

[Java知识库]SpringMVC出现多个拦截器时候的拦截情况

假设目前配置两个拦截器

设置FirstIntercetpor关闭拦截

设置SecondInterceptor打开拦截

我们来执行,结果如下

根据结果我们可以得出结论,?FirstIntercetpor执行了preHandle,afterCompletion

SecondInterceptor执行preHandle

接着找源码在DispatchServelet中找到doDispatch中applyPreHandle,该方法负责处理preHandle

?

我们点进去

此处是关键

我们来看debug数据,接下来我们要一步一步debug查看相关信息

?

?第一步这里我们看到此处的拦截器并非我们配置的拦截器,为系统默认,无关紧要

?我们几次f8跳过,然后再f7跳入,此处的拦截器依然不是我们配置的,继续进行?

重点来了

?

看这里,这一次执行到了第三拦截器,这个是我们配置的FirstIntercetpor拦截器,我们注意这里的执行过程

?一次f7,这里到了我们配置的拦截器内部开始执行我们的拦截器preHandle方法

?这里我们的返回值为true,因此红线部分条件不成立,我们不执行if语句,进入下一个循环

下一个循环我们进入我们配置的SecondInterceptor拦截器的preHandle方法

我们继续进行,这一次返回值为false,加上前面的!号,双重否定即肯定,我们这一次开始执行if方法?

?

我们注意到这个if语句中唯一的方法triggerAfterCompletion,这个就是处理我们AfterCompletion方法的,我们进入这个方法内部

?重点来了,这里的拦截器来看一下,是FirstIntercetpor拦截器,那么这里将要执行的方法自认就是FirstIntercetpor拦截器的afterCompletion

?

?

那么问题来了,为什么这里找到的是FirstIntercetpor

我们再次回到之前的方法

这里面有一个叫interceptorIndex的参数

这个参数是dispatchservelet的公共参数,

在我们的applyPreHandle跟afterCompletion都有调用

在执行之前的applyPreHandle方法中,这个数字是从0开始依次加一,直到满this.interceptorList.size(),

而+1的前提就是if方法不执行,if方法不执行的前提是取到拦截器的PreHandle方法返回值为true,前面三个拦截器都放行,所以interceptorIndex增长到了2,

到SecondInterceptor拦截器的时候,他PreHandle返回值为false,执行if方法,interceptorIndex不增长,

而triggerAfterCompletion中的循环是从interceptorIndex递减到0,那么自认不会执行SecondInterceptor拦截器的afterCompletion方法

执行完triggerAfterCompletion,applyPreHandle执行结束,返回false

我们接着看

?applyPreHandle返回false那么if语句就成立,dodispatch方法执行结束

后面的

视图渲染方法

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

视图加载方法

this.applyDefaultViewName(processedRequest, mv);

传递信息方法

mappedHandler.applyPostHandle(processedRequest, response, mv);

运行处理结果方法

his.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);

自然统统不执行,自此拦截过程结束

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 20:59:25  更:2022-02-14 21:01:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:01:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码