一、正常流程下的攔截器(全部放行)
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不執行。