1. 程式人生 > >攔截器定義與配置

攔截器定義與配置

攔截器如是說,我是幹嘛的:攔截使用者的請求,在請求的前後新增處理邏輯

Spring MVC提供了Interceptor攔截器機制,用於請求的預處理和後處理。在Spring MVC中定義一個攔截器有兩種方法:

  • 第一種:實現HandlerInterceptor介面,或繼承實現了該介面的類(如:HandlerInterceptorAdaptor)
  • 第二種:實現WebRequestInterceptor介面,或繼承實現了該介面的類

這些攔截器都是在Handler的執行週期內進行攔截操作的

實現HandlerInterceptor介面

HandlerInterceptor介面原始碼

public interface HandlerInterceptor{
    boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception;

    void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,
        ModelAndView modelAndView) throws Exception;

    void afterCompletion(HttpServletRequest request,HttpServletResponse response,
        Object handler,Exception ex) throws Exception;
    

}

preHandle方法:執行Handler方法前執行,返回false,不響下執行;返回true,放行(若後面無其他Interceptor,則執行                                    Controller方法)

postHandle方法:執行完Handler方法之後,返回ModelAndView之前執行。多用於統一處理返回的檢視

afterCompletion方法:執行完Handler方法之後執行,由於是在Controller方法執行完畢後執行該方法,多適用於統一的異常或                                           者日誌處理操作

       需要在Spring的類載入配置檔案中配置攔截器實現類,才能使攔截器起到攔截的效果。HandlerInterceptor類載入配置有兩種方式,分別是"針對HandlerMapping配置"和"全域性配置"

       針對攔截器配置:需要在某個HandlerMapping配置中將攔截器作為引數配置進去,此後通過該HandlerMapping對映成功的Handler就會使用配置好的攔截器,樣例配置如下:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="hInterceptor1"/>
            <ref bean="hInterceptor2"/>
        </list>
    </propety>
</bean>
<bean id="hInterceptor1" class="cn.com.mvc.interceptor.HandlerInterceptorDemo1" />
<bean id="hInterceptor2" class="cn.com.mvc.interceptor.HandlerInterceptorDemo1" />

       這裡為BeanNameUrlHandlerMapping處理器對映器配置了一個interceptors攔截器鏈,該攔截器鏈中包含了兩個攔截器,分別為“hInterceptor1”和“hInterceptor2”,具體的實現分別為對應下面id為“hInterceptor1”和“hInterceptor2”的bean配置

       此種配置的優點是針對具體的處理器對映器進行攔截操作缺點是如果使用多個處理器對映器,就要在多處新增攔截器的配置資訊,比較繁瑣。

       針對全域性配置:只需要在Spring的類載入配置檔案中新增"<mvc:interceptors>"標籤對在該標籤對中配置的攔截器,可以起到全域性攔截器的作用,這是因為該配置會將攔截器注入到每一個HandlerMapping處理器對映器中。樣例配置如下:

<!--攔截器-->
<mvc:inceptors>
    <!--多個攔截器,順序執行-->
    <mvc:interceptor>
        <!--/**表示所有url包括url路徑-->
        <mvc:mapping path="/**"/>
        <bean class="cn.com.mvc.interceptor.HandlerInterceptorDemo1"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="cn.com.mvc.interceptor.HandlerInterceptorDemo2"/>
    </mvc:interceptor>
</mvc:interceptors>

實現WebRequestInterceptor介面