攔截器定義與配置
攔截器如是說,我是幹嘛的:攔截使用者的請求,在請求的前後新增處理邏輯
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>