springMvc攔截器的執行順序!
攔截器的各個方法的作用:
/** * 登入驗證攔截器 */
public class Intercepter implements HandlerInterceptor {
/*
* 執行時機:視圖已經被解析完畢,類似try catch 後的finally,追蹤錯誤
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception {
}
/**
* 執行時機:controller執行完,視圖解析器沒有把視圖解析成頁面,
* 對視圖做統一的修改,主要展現在Model上,可以追加資料
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception {
Map<String,Object> map=mv.getModel();
map.put("test","append something");
}
/**
* 執行時機:在執行controller之前來執行
* 傳回值類型:boolean:true代表放行可以通路controller,false不可以通路controller
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
return false;
}
}
寫了兩個攔截器,配置如下:
<!-- 配置攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/><!-- 表示所有的url,包括子url路徑 --><!-- 某一子產品的攔截:/myPath/**, 攔截所有的請求/**-->
<bean class="com.interceptors.EncodingInterceptor"></bean>
</mvc:interceptor>
<!--配置登陸攔截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.interceptors.LoginHandlerIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
沒寫什麼邏輯,就列印了log,LoginHandlerIntercepter中的log是01
結果簡略如下:
preHandle.........
preHandle01.........
...
...
...
postHandle01.........
postHandle.........
...
...
...
afterCompletion01.........
afterCompletion.........
可以看出,按照攔截器的配置順序先執行了字元攔截器,後執行了登入驗證的攔截器;
但是:preHandler是按照攔截器的配置順序執行的,而postHandler和afterCompletion是按照攔截器的配置順序的倒序執行的
是以 :
如果統一日志處理器攔截器,需要改攔截器prehandler一定要傳回true,且将它放在攔截器配置的第一個位置;
如果登陸認證攔截器,放在攔截器的配置中的第一個位置(有日志處理的話,放在日志處理下面);
如果有權限校驗攔截器,則放在登陸攔截器之後,因為登陸通過後,才可以進行校驗權限;