SpringMVC自定義多個攔截器執行順序
一、正常流程下的攔截器(全部放行)
1.springMVC中攔截器實現這個接口HandlerInterceptor
第一個攔截器 HandlerInterceptor1
- public class HandlerInterceptor1 implements HandlerInterceptor {
- //進入 Handler方法之前執行
- //用於身份認證、身份授權
- //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
-
public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor1...preHandle");
- //return false表示攔截,不向下執行
- //return true表示放行
- return true;
- }
- //進入Handler方法之後,返回modelAndView之前執行
-
//應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println("HandlerInterceptor1...postHandle");
- }
- //執行Handler完成執行此方法
- //應用場景:統一異常處理,統一日誌處理
-
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- System.out.println("HandlerInterceptor1...afterCompletion");
- }
- }
第二個攔截器 HandlerInterceptor2
- public class HandlerInterceptor2 implements HandlerInterceptor {
- //進入 Handler方法之前執行
- //用於身份認證、身份授權
- //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor2...preHandle");
- //return false表示攔截,不向下執行
- //return true表示放行
- return true;
- }
- //進入Handler方法之後,返回modelAndView之前執行
- //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println("HandlerInterceptor2...postHandle");
- }
- //執行Handler完成執行此方法
- //應用場景:統一異常處理,統一日誌處理
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- System.out.println("HandlerInterceptor2...afterCompletion");
- }
- }
springMVC.xml中配置兩個攔截器
- <!--攔截器 -->
- <mvc:interceptors>
- <!--多個攔截器,順序執行 -->
- <mvc:interceptor>
- <!-- /**表示所有url包括子url路徑 -->
- <mvc:mapping path="/**"/>
- <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
- </mvc:interceptor>
- <mvc:interceptor>
- <mvc:mapping path="/**"/>
- <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
- </mvc:interceptor>
- </mvc:interceptors>
查看打印的日誌信息
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle
HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion
這是正常的攔截器執行流程
以上執行的攔截器是正常流程的攔截器的順序
二、非正常情況下的攔截器(第一個攔截器放行,第二個攔截器攔截)
細心的讀者會發現在攔截器中preHandle方法中的返回值我做了註解, //return false表示攔截,不向下執行//return true表示放行
- public class HandlerInterceptor2 implements HandlerInterceptor {
- //進入 Handler方法之前執行
- //用於身份認證、身份授權
- //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor1...preHandle");
- //return false表示攔截,不向下執行
- //return true表示放行
- return false;
- }
再次啟動系統攔截器的執行順序
日誌打印
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion
總結:
攔截器1放行,攔截器2 preHandle才會執行。
攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執行。
只要有一個攔截器不放行,postHandle不會執行。
二、非正常情況下的攔截器(第一個攔截器攔截,第二個攔截器攔截)
- public class HandlerInterceptor1 implements HandlerInterceptor {
- //進入 Handler方法之前執行
- //用於身份認證、身份授權
- //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor1...preHandle");
- //return false表示攔截,不向下執行
- //return true表示放行
- return false;
- }
- public class HandlerInterceptor2 implements HandlerInterceptor {
- //進入 Handler方法之前執行
- //用於身份認證、身份授權
- //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor2...preHandle");
- //return false表示攔截,不向下執行
- //return true表示放行
- return false;
- }
日誌打印
HandlerInterceptor1...preHandle
總結
攔截器1 preHandle不放行,postHandle和afterCompletion不會執行。
攔截器1 preHandle不放行,攔截器2不執行。
SpringMVC自定義多個攔截器執行順序