1. 程式人生 > >SpringMVC自定義多個攔截器執行順序

SpringMVC自定義多個攔截器執行順序

true pos out itl 表示 src blog lin 應用

一、正常流程下的攔截器(全部放行)

1.springMVC中攔截器實現這個接口HandlerInterceptor

第一個攔截器 HandlerInterceptor1

  1. public class HandlerInterceptor1 implements HandlerInterceptor {
  2. //進入 Handler方法之前執行
  3. //用於身份認證、身份授權
  4. //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
  5. @Override
  6. public boolean preHandle(HttpServletRequest request,
  7. HttpServletResponse response, Object handler) throws Exception {
  8. System.out.println("HandlerInterceptor1...preHandle");
  9. //return false表示攔截,不向下執行
  10. //return true表示放行
  11. return true;
  12. }
  13. //進入Handler方法之後,返回modelAndView之前執行
  14. //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖
  15. @Override
  16. public void postHandle(HttpServletRequest request,
  17. HttpServletResponse response, Object handler,
  18. ModelAndView modelAndView) throws Exception {
  19. System.out.println("HandlerInterceptor1...postHandle");
  20. }
  21. //執行Handler完成執行此方法
  22. //應用場景:統一異常處理,統一日誌處理
  23. @Override
  24. public void afterCompletion(HttpServletRequest request,
  25. HttpServletResponse response, Object handler, Exception ex)
  26. throws Exception {
  27. System.out.println("HandlerInterceptor1...afterCompletion");
  28. }
  29. }

第二個攔截器 HandlerInterceptor2

  1. public class HandlerInterceptor2 implements HandlerInterceptor {
  2. //進入 Handler方法之前執行
  3. //用於身份認證、身份授權
  4. //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
  5. @Override
  6. public boolean preHandle(HttpServletRequest request,
  7. HttpServletResponse response, Object handler) throws Exception {
  8. System.out.println("HandlerInterceptor2...preHandle");
  9. //return false表示攔截,不向下執行
  10. //return true表示放行
  11. return true;
  12. }
  13. //進入Handler方法之後,返回modelAndView之前執行
  14. //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖
  15. @Override
  16. public void postHandle(HttpServletRequest request,
  17. HttpServletResponse response, Object handler,
  18. ModelAndView modelAndView) throws Exception {
  19. System.out.println("HandlerInterceptor2...postHandle");
  20. }
  21. //執行Handler完成執行此方法
  22. //應用場景:統一異常處理,統一日誌處理
  23. @Override
  24. public void afterCompletion(HttpServletRequest request,
  25. HttpServletResponse response, Object handler, Exception ex)
  26. throws Exception {
  27. System.out.println("HandlerInterceptor2...afterCompletion");
  28. }
  29. }

springMVC.xml中配置兩個攔截器

  1. <!--攔截器 -->
  2. <mvc:interceptors>
  3. <!--多個攔截器,順序執行 -->
  4. <mvc:interceptor>
  5. <!-- /**表示所有url包括子url路徑 -->
  6. <mvc:mapping path="/**"/>
  7. <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
  8. </mvc:interceptor>
  9. <mvc:interceptor>
  10. <mvc:mapping path="/**"/>
  11. <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
  12. </mvc:interceptor>
  13. </mvc:interceptors>

查看打印的日誌信息


HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle

HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle

HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion

這是正常的攔截器執行流程

技術分享圖片

以上執行的攔截器是正常流程的攔截器的順序

二、非正常情況下的攔截器(第一個攔截器放行,第二個攔截器攔截)

細心的讀者會發現在攔截器中preHandle方法中的返回值我做了註解, //return false表示攔截,不向下執行//return true表示放行

  1. public class HandlerInterceptor2 implements HandlerInterceptor {
  2. //進入 Handler方法之前執行
  3. //用於身份認證、身份授權
  4. //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
  5. @Override
  6. public boolean preHandle(HttpServletRequest request,
  7. HttpServletResponse response, Object handler) throws Exception {
  8. System.out.println("HandlerInterceptor1...preHandle");
  9. //return false表示攔截,不向下執行
  10. //return true表示放行
  11. return false;
  12. }

再次啟動系統攔截器的執行順序

日誌打印

HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion

總結:

攔截器1放行,攔截器2 preHandle才會執行。

攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執行。

只要有一個攔截器不放行,postHandle不會執行。

二、非正常情況下的攔截器(第一個攔截器攔截,第二個攔截器攔截)

  1. public class HandlerInterceptor1 implements HandlerInterceptor {
  2. //進入 Handler方法之前執行
  3. //用於身份認證、身份授權
  4. //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
  5. @Override
  6. public boolean preHandle(HttpServletRequest request,
  7. HttpServletResponse response, Object handler) throws Exception {
  8. System.out.println("HandlerInterceptor1...preHandle");
  9. //return false表示攔截,不向下執行
  10. //return true表示放行
  11. return false;
  12. }
  1. public class HandlerInterceptor2 implements HandlerInterceptor {
  2. //進入 Handler方法之前執行
  3. //用於身份認證、身份授權
  4. //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
  5. @Override
  6. public boolean preHandle(HttpServletRequest request,
  7. HttpServletResponse response, Object handler) throws Exception {
  8. System.out.println("HandlerInterceptor2...preHandle");
  9. //return false表示攔截,不向下執行
  10. //return true表示放行
  11. return false;
  12. }

日誌打印

HandlerInterceptor1...preHandle

總結

攔截器1 preHandle不放行,postHandle和afterCompletion不會執行。

攔截器1 preHandle不放行,攔截器2不執行。

SpringMVC自定義多個攔截器執行順序