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中的拦截器

HandlerInterceptorAdapter

拦截器HandlerInterceptor接口有三个回调方法(注释是翻译的源码英文注释,可能略有拗口)
1.preHandle方法

/**
拦截处理程序(接口)。 在 HandlerMapping 确定适当的处理程序对象之后,但在 HandlerAdapter 调用处理程序之前调用。
DispatcherServlet 处理执行链中的处理程序,该处理程序由任意数量的拦截器组成,最后执行被拦截的接口。
使用此方法,每个拦截器都可以决定中止执行链,通常是发送 HTTP 错误或编写自定义响应。
**/
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;

2.postHandle方法,

/**
在 HandlerAdapter 实际调用处理程序之后,但在 DispatcherServlet 呈现视图之前调用。
可以通过给定的 ModelAndView 向视图公开其他模型对象。
DispatcherServlet 处理执行链中的处理程序,该处理程序由任意数量的拦截器组成。
通过postHandle,每个拦截器都可以对执行进行后处理,以执行链的相反顺序应用。
注意:特殊注意事项适用于异步请求处理。
**/
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;

3.afterCompletion方法,

/**
请求处理完成后的回调,即渲染视图后。 将在处理程序执行的任何结果上调用,从而允许适当的资源清理。

  注意:仅当此拦截器的 {@code preHandle} 时才会调用
方法已成功完成并返回 {@code true}!

与 {@code postHandle} 方法一样,该方法将在链中的每个拦截器上以相反的顺序被调用,因此第一个拦截器将是最后一个被调用的拦截器。
**/
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;

实际例子解释运行链条

spring-servlet.xml

<mvc:interceptors>
<bean class="com.interceptor.RateLimitInterceptor">
<property name="urlProperties">
<props>
<prop key="/api/test">200</prop>
</props>
</property>
</bean>
<bean class="com.interceptor.LoginInterceptor"/>
<bean class="com.interceptor.AuthInterceptor">
<constructor-arg index="0" value="#{app.mainSite}"/>
<constructor-arg index="1" value="#{app.context}"/>
<constructor-arg index="2" value="#{app.mode}"/>
<constructor-arg index="3" ref="jedisTemplate"/>
<constructor-arg index="4" value="#{app.domain}"/>
<constructor-arg index="5" value="#{app.htphead}"/>
</bean>
</mvc:interceptors>
 

拦截器的执行顺序:
  在这里插入图片描述

执行结果

每个拦截器的三个方法里面都加了打印----------
1.所有拦截器的preHandle都为true的运行结果如下:
在这里插入图片描述
运行链条:
在这里插入图片描述

2.前两个拦截器prehandle为true,第三个的prehandle为false,结果如下:
在这里插入图片描述
运行链条:
在这里插入图片描述
3.controller方法抛异常在这里插入图片描述
在这里插入图片描述

总结

运行流程总结如下:

1、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。

2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。

3、然后执行主方法(自己的controller接口)若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。

4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的afterCompletion方法。(postHandle和afterCompletion都是倒序执行)
  
下一篇将针对RateLimitInterceptor限流拦截器,进行详细讲解。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:09:53  更:2022-04-09 18:13:10 
 
开发: 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 5:23:11-

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