SpringMVC攔截器介紹
(1)簡介
(1)
interceptor
,
是springmvc提供的用來攔截請求的
(2)類似于Servlet的過濾器(Filter)。
(3)給某一些請求加一定處理。
(4)在springMVC中,所有的請求都會走到前端控制器中。攔截器配合前端控制對于某一些請求進行處理。
(5)經常用于權限驗證、記錄請求資訊的日志、判斷使用者是否登入等。
(6)SpringMVC的攔截器是基于Spring AOP實作的。
(2)攔截器與過濾器的差別
filter,是javaEE 提供的用來攔截請求的,所有請求都能攔截
後者隻能攔截控制器的方法

(3)攔截器的三個方法
HandlerInterceptor接口
執行順序
單攔截器
(1)實作HandlerInterceptor接口
//1:實作一個接口HandlerInterceptor
public class Demo01Interceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
(2)重寫preHandle,postHandle,afterCompletion方法
-
preHandle
在handler方法處理請求之前執行。該方法傳回boolean類型資料,表示如果傳回true,繼續執行後面的方法,如果傳回false,後面的方法都不會執行。
後面的方法指的是:(1)其他的攔截器的方法(2)該攔截器的方法。(3)請求的handler方法也不會執行。
總結:(1)如果攔截器的preHandle方法,傳回false,那麼其他攔截器的方法(preHandle,postHandle和afterCompletion)都不會執行。
(2)如果攔截器的preHandle方法,傳回false,該攔截器的其他方法(postHandle和afterCompletion)都不會執行。例如:請求 /offer/saveOffer , prHandle方法裡面的代碼會在saveOffer方法執行之前執行。
(3)Controller中的方法也不會執行。
-
postHandle
在handler方法處理請求之後,傳回ModelAndView之前執行。
-
afterCompletion
在完成請求之後執行。
(3)配置攔截器
在springMVC配置檔案中配置。
-
(1)全局的攔截器配置
表示攔截所有的請求。
<mvc:interceptors>
<!-- 配置一個全局攔截器,攔截所有請求 -->
<bean class="interceptor.TestInterceptor"/>
</mvc:interceptors>
- (2)具體的路徑攔截器
*配置攔截的路徑
*配置執行的攔截器類。
<!-- 配置攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置攔截器作用的路徑 -->
<mvc:mapping path="/**"/>
<!-- 配置不需要攔截作用的路徑 -->
<mvc:exclude-mapping path=""/>
<!-- 定義在<mvc:interceptor>元素中,表示比對指定路徑的請求才進行攔截 -->
<bean class="interceptor.Interceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 配置攔截器作用的路徑 -->
<mvc:mapping path="/gotoTest"/>
<!-- 定義在<mvc:interceptor>元素中,表示比對指定路徑的請求才進行攔截 -->
<bean class="interceptor.Interceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
多攔截器
(1)什麼是多攔截器
應用軟體可用配置很多個攔截器,不同的攔截器實作不同一個功能。
(2)開發多攔截器
和單攔截器相同,開發多個不同功能的攔截器。不同的功能實際上指的就是攔截器對于HandlerInceptor的三個方法的實作邏輯不同。
(3)配置多攔截器
-
配置全局的多攔截器
在mvc:interceptors 裡面配置多個Bean.
-
配置某一路徑的多攔截器
在mvc:interceptors裡面配置多個mvc:interceptor。
- 在配置多個springMVC攔截器的時候,是有順序的。按從上到下的順序。
springmvc.xml
<!--攔截器使用第二步:配置攔截器-->
<mvc:interceptors>
<!--用于測試的攔截器-->
<mvc:interceptor>
<!--攔截路徑的配置-->
<mvc:mapping path="/demo05.action"/>
<bean id="interceptor1" class="com.wzx.interceptor.Demo01Interceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--攔截路徑的配置-->
<mvc:mapping path="/demo05.action"/>
<bean id="interceptor2" class="com.wzx.interceptor.Demo02Interceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--攔截路徑的配置-->
<mvc:mapping path="/demo05.action"/>
<bean id="interceptor3" class="com.wzx.interceptor.Demo03Interceptor"/>
</mvc:interceptor>
</mvc:interceptors>
(4)多攔截器的執行流程
總結:
- (1)攔截器的順序與springMVC中配置的攔截器順序相同。
- (2)先執行第一個攔截器的preHandle方法。如果preHandle1傳回true。執行攔截器2的preHanle2。所有的PreHandle方法執行完了以後,并且都是true,才會執行Controller的對應方法。
- (3)Controller的方法執行完了以後,先執行後面的攔截器的posthandle方法。如上圖所示,先執行postHandle2,再執行postHandle1。
- (4)執行完所有的攔截器的postHandle方法後,controller傳回ModelAndView。
- (5)Controller處理完請求以後,再執行後面的攔截器的afterCompletion方法。如上圖所示,先執行afterCompletion2,再執行afterCompletion1.