我们配置多个拦截器,看看输出结果:
开始执行
查看结果
我们可以看出多个拦截器的执行顺序为
- preHandle:从第一个往后执行
- postHandle:从后往前执行
- afterCompletion:从后往前执行
这里的先后为配置拦截器的顺序:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="Interceptors.FirstInterceptor"/><!-- 第一个拦截器 -->
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="Interceptors.SecondInterceptor"/><!-- 第二个拦截器 -->
</mvc:interceptor>
<!--<ref bean="firstInterceptor"></ref>-->
</mvc:interceptors>
为什么会是这种顺序呢,我们一步一步通过源码流程来看:
当我们preHandle()返回值全部为true时
经过上述分析,我们可以清晰的了解到为什么会有那种顺序的执行方式了
那要是拦截器链的所有preHandle中有的返回false呢?
preHandle()返回false
还是用我们上面的案例,设置两个preHandle返回值都为false
看运行结果:
First preHandle
下面来看分析:
通过分析和结果证明了我们的推理过程
还是用我们上面的案例,设置第一个为true,第二个为false
看运行结果:
First preHandle
Second preHandle
First afterHandle
我们通过上面的分析过程再来分析:
在进入applyHandle方法后,通过if条件判断,第一个preHandle返回true,执行一次,输出First preHandle
,InterceptorIndex计数一次,第二次判断的时候执行了第二个拦截器的preHandle,输出在second preHandle
,该拦截器返回false,然后执行triggerAfterCompletion(),根据计数InterceptorIndex执行对应拦截器的afterCompletion方法,输出First AfterHandle