天天看點

SSM——SpringMVC攔截器詳細介紹SpringMVC攔截器介紹單攔截器多攔截器

SpringMVC攔截器介紹

(1)簡介

(1)

interceptor

是springmvc提供的用來攔截請求的

(2)類似于Servlet的過濾器(Filter)。

(3)給某一些請求加一定處理。

(4)在springMVC中,所有的請求都會走到前端控制器中。攔截器配合前端控制對于某一些請求進行處理。

(5)經常用于權限驗證、記錄請求資訊的日志、判斷使用者是否登入等。

(6)SpringMVC的攔截器是基于Spring AOP實作的。

(2)攔截器與過濾器的差別

filter,是javaEE 提供的用來攔截請求的,所有請求都能攔截

後者隻能攔截控制器的方法

SSM——SpringMVC攔截器詳細介紹SpringMVC攔截器介紹單攔截器多攔截器

(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方法

SSM——SpringMVC攔截器詳細介紹SpringMVC攔截器介紹單攔截器多攔截器
  • 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)多攔截器的執行流程

SSM——SpringMVC攔截器詳細介紹SpringMVC攔截器介紹單攔截器多攔截器

總結:

  • (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.