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


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

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不執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM