我們配置多個攔截器,看看輸出結果:
開始執行
查看結果
我們可以看出多個攔截器的執行順序爲
- 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