springMVC中多个自定义拦截器方法的执行顺序
来源:互联网 发布:现货倚天技术指标源码 编辑:程序博客网 时间:2024/05/16 04:07
springMVC中多个自定义Interceptor的执行顺序
1,正常执行时(即:所有的preHandle()函数都返回true)
springMVC中提供了接口来帮助我们自定义拦截器。我们只需要继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类或者实现org.springframework.web.servlet.HandlerInterceptor接口然后实现相应的方法就可以自定义拦截器了。
在写好了拦截器类后,在springMVC的配置文件中添加类似的配置信息就可以拦截具体的url。
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.zkw.interceptor.loginInterceptor.testInterceptor" /> </mvc:interceptor> </mvc:interceptors>
在<mvc:interceptors>
的标签中还可以针对不同的匹配路径指定多个拦截器,类似的如下所述
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.zkw.interceptor.loginInterceptor.tsetInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.zkw.interceptor.loginInterceptor.test1Interceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.zkw.interceptor.loginInterceptor.test2Interceptor" /> </mvc:interceptor> </mvc:interceptors>
当匹配多个路径时,拦截器的执行顺序是什么样的呢?
针对上述配置,分别创建了三个拦截器LoginInterceptor、testInterceptor、test1Interceptor,
每个拦截器的代码大致相同。
package com.zkw.interceptor.loginInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class testInterceptor extends HandlerInterceptorAdapter{ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { int a = 0; System.out.println("第一个拦截器preHandle"); return true; } public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println(); System.out.println("第一个拦截器的postHandle"); } public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println(); System.out.println("第一个拦截器的afterCompletion"); }}
当输入一个url后,控制台打印结果如下:
由此可见:拦截器正常执行时拦截器方法的执行顺序为:配置文件中在前面的拦截器的preHandle()方法先执行,然后根据配置文件中拦截器的顺序依次执行拦截器的preHandle()方法,等所有拦截器的preHandle()方法执行完成后,逆序执行每个拦截器的postHandle()方法,当所有postHandle()方法执行完成后,再逆序执行afterCompletion()方法
2,非正常执行时(即:在执行拦截器时,有的拦截器的preHandle()返回false)
修改上述springMVC的配置文件拦截器的顺序以及匹配的路径。
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/main/**"/> <bean class="com.zkw.interceptor.loginInterceptor.testInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/main/**"/> <bean class="com.zkw.interceptor.loginInterceptor.test1Interceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.zkw.interceptor.loginInterceptor.LoginInterceptor" /> </mvc:interceptor> </mvc:interceptors>
在浏览器输入localhost:8080/spiderAndAnalysis/main/index地址,将匹配以上三个拦截器。运行的结果如下:
这里只是改变了拦截器的顺序,其他的代码一点都没有变。从运行的结果可以看出在执行完三个拦截器的preHandle()函数之后,就突然跳到第三个拦截器的afterCompletion()方法,然后执行第二个拦截器的afterCompletion()方法就结束了。这是因为在我的程序中执行到第一个拦截器的preHandle()方法的时候,返回了false。所以当拦截器非正常执行完成时,会直接跳过所有拦截器的postHandle()函数,然后再逆向的执行preHandle()函数返回为true时的afterCompletion()方法。
- springMVC中多个自定义拦截器方法的执行顺序
- SpringMVC多拦截器的方法执行顺序
- springMVC中多个拦截器Interceptor的执行顺序
- springMVC中多个拦截器Interceptor的执行顺序
- springMVC中多个拦截器Interceptor的执行顺序
- springMVC中多个拦截器Interceptor的执行顺序
- springmvc多个拦截器中拦截器方法的执行顺序
- springmvc单个拦截器中拦截器方法的执行顺序
- SpringMVC自定义多个拦截器执行顺序
- springmvc拦截器和拦截器执行顺序
- 拦截器的执行顺序
- 拦截器的执行顺序
- 拦截器的执行顺序
- Java过滤器,SpringMVC拦截器之间的区别与执行顺序
- 拦截器执行顺序
- mybatis拦截器的执行顺序
- Action 与 拦截器执行的顺序
- mybatis拦截器的执行顺序
- jQuery实现的截取字符串后面以省略号替代
- maven profile实现多环境打包
- mybatis延迟加载开关
- 作业2017.10.12
- 模板:块状链表
- springMVC中多个自定义拦截器方法的执行顺序
- elasticsearch+kibana安装
- Hive学习--架构和基本组成
- Linux下安装mysql
- 熵编码之CABAC
- 获取动态数据到echarts-地图
- Oracle tnsnames.ora和listener.ora
- change和onchange、click和onclick的区别
- 关于解决Python使用pip安装pyjnius时的问题(windows平台)