SpringMVC拦截器及多拦截器时的执行顺序
本文链接:https://blog.csdn.net/itcats_cn/article/details/80371639
拦截器的配置步骤
springmvc.xml中配置多个拦截器
配置自定义拦截器并实现接口
<!-- 配置springmvc拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 对什么url路径进行拦截 /**代表对全路径拦截 -->
<mvc:mapping path="/**"/>
<!-- 注入自定义拦截器到bean标签 -->
<bean class="cn.itcats.ssm.interception.Inteceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcats.interception.Inteceptor2" />
</mvc:interceptor>
</mvc:interceptors>
//拦截器1
public class Inteceptor1 implements HandlerInterceptor{
//方法执行前1
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean类型 决定是否放行
System.out.println("方法执行前1");
return true;
}
//方法执行后1
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法执行后1");
}
//页面渲染后1
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("页面渲染后1");
}
}
//拦截器2
public class Inteceptor2 implements HandlerInterceptor{
//方法执行前2
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean类型 决定是否放行
System.out.println("方法执行前2");
return true;
}
//方法执行后2
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法执行后2");
}
//页面渲染后2
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("页面渲染后2");
}
}
SpringMVC拦截器配置后,主要对三个过程进行拦截校验:
方法执行前(有boolean返回值,返回true则放行)【Hanler执行之前】
方法执行后【Handler执行之后,ModelAndView返回之前】
页面渲染后【ModelAndView执行之后,对异常处理】
多个拦截器执行顺序
如有两个拦截器
(1)方法执行前返回值都为true,则顺序如下
方法执行前1
方法执行前2
方法执行后2
方法执行后1
页面渲染后2
页面渲染后1
方法1和方法2是相对的,取决于springmvc自定义拦截器类配置的先后顺序(这里是自定义拦截器1先于拦截器2)
总结起来: 拦截器1中的方法执行前1先执行,后执行拦截器2中的方法执行前2方法,后拦截器2的方法先于拦截器1的方法执行
(2)拦截器1中方法执行前1 返回值为false,而拦截器2中方法执行前2返回值为 true 执行顺序如下:
方法执行前1 //此时被拦截,不放行
总结起来:只执行拦截器1方法执行前的方法,当拦截器1方法执行前被拦截,返回值为false不被放行,后面的拦截器链都不执行,无论2的返回值是true还是false
(3)拦截器1中方法执行前1 返回值为true,而拦截器2中方法执行前2返回值为 false 执行顺序如下:
方法执行前1
方法执行前2 //被拦截,不放行
页面渲染后1
总结执行顺序:
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用
如何让两个Interceptor有序执行呢?
如果继承WebMvcConfigurationSupport,需要处理所有SpringMVC为我们提供的接口实现,所以我们继承WebMvcConfigurerAdapter,我们想要Interceptor顺序执行,重写addInterceptor()方法
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(authInterceptor).excludePathPatterns("/static").addPathPatterns("/**");
registry
.addInterceptor(authActionInterceptor).addPathPatterns("/house/toAdd")
.addPathPatterns("/accounts/profile").addPathPatterns("/accounts/profileSubmit")
.addPathPatterns("/house/bookmarked").addPathPatterns("/house/del")
.addPathPatterns("/house/ownlist").addPathPatterns("/house/add")
.addPathPatterns("/house/toAdd").addPathPatterns("/agency/agentMsg")
.addPathPatterns("/comment/leaveComment").addPathPatterns("/comment/leaveBlogComment");
super.addInterceptors(registry);
————————————————
版权声明:本文为CSDN博主「itcats_cn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/itcats_cn/article/details/80371639
SpringMVC拦截器及多拦截器时的执行顺序的更多相关文章
- Struts2配置拦截器,struts2加载常量时的搜索顺序
1:struts2加载常量时的搜索顺序 1.Struts-default.xml 2.Struts-plugin.xml 3.Struts.xml 4.Struts-properties(自己创建的) ...
- Javascript在页面加载时的执行顺序【转】
一.在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间 由<script />标记的src属 ...
- 当C#中带有return的TryCatch代码遇到Finally时代码执行顺序
编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把 ...
- [转]多个ajax请求时控制执行顺序或全部执行后的操作
本文转自:https://blog.csdn.net/fsdad/article/details/71514822 一.当确保执行顺序时: 1. 请求加async: false,,这样所有的ajax就 ...
- 多个ajax请求时控制执行顺序或全部执行后的操作
1.当确保执行顺序时 (1)请求加async: false,,这样所有的ajax就会同步执行,请求顺序就是代码顺序: (2)$.when 确保所有异步的ajax请求完毕时 $.when($.aja ...
- Java问题解读系列之基础相关---含继承时的执行顺序
今天来研究一下含继承.静态成员.非静态成员时Java程序的执行顺序: 一.不含继承,含有静态变量.静态代码块 创建一个子类,该类包含静态变量.静态代码块.静态方法.构造方法 /** * @create ...
- 登录linux时 shell执行顺序
# .bash_history,.bash_logout,.bash_profile,.bashrc/etc/profile 全局.bash_history 记录当前登录用户历史操作的命令.bash_ ...
- python导入模块时的执行顺序
当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这个mo ...
- try、finally代码块有无return时的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并 ...
随机推荐
- SDK的使用步骤
SDK包括三种类型文件: (1).头文件(.h) (2).库文件(.lib) (3).动态库(.dll) 第一步:在项目目录中新建一个Libs文件夹,再在该文件夹中分别新建inc文件夹和lib文件夹, ...
- 字典的学习1——参考Python编程从入门到实践
字典:从汉语词意的角度理解,字典就是一个工具书,可以查找某个字.词.成语等的详细解释,字与解释相对应,而Python中字典则是一些列键和值相对应. Python中,字典放在花括号{键:值}中,eg: ...
- Scratch(二)来不及解释了,马上开始编程游戏
来来来,上一期你们都经过了”HelloWorld”神咒的加持,已入编程大门,我们今天就开始一边做游戏,一边熟悉Scratch. “我只是切出去抢了个红包,一回来就到了编程游戏的环节了?” 对,你没跑错 ...
- C++11 特性
之前工作中开发/维护的模块大多都是 "远古代码",只能编译 C++98,很多 C++11 的特性都忘得差不多了,再回顾一下 右值引用&转移语义: 消除两个对象交互时不必要的 ...
- 关键字:__thread & pthread_key_t
在说__thread之前,先来看看pthread_ket_t吧. 参考:http://blog.csdn.net/lmh12506/article/details/8452700 上面的博文说的比较通 ...
- axios配置及使用(发起请求时带上token)
1.安装 利用npm安装 npm install axios --save 2.引入即可使用 import axios from 'axios' 3.目录 4.各个文件设置: (1)env.js ex ...
- 0-1背包问题——动态规划求解【Python】
动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...
- elementui限制开始日期和结束日期
项目需求:开始日期和结束日期 禁用当前日期之前的日期.同时结束日期 禁用开始日期之前的日期 <div class='startTime'> 开始时间:<el-date-picker ...
- Chrome安装crx文件的插件时出现“程序包无效”
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/11043453.html 链接:https: ...
- OpenStack kilo版(7) 部署dashboard
安装dashboard root@controller:~# apt-get install openstack-dashboard 配置 /etc/openstack-dashboard/loc ...