繼承HandlerInterceptorAdapter實現MVC攔截器
有兩種常用的方法實現SpringMVC攔截器:
HandlerInterceptor
1.一種是實現HandlerInterceptor接口,這個接口的一種常用實現是HandlerInterceptorAdapter類,我們可以通過直接繼承HandlerInterceptor接口實現攔截器,也可以繼承HandlerInterceptorAdapter類,復寫其方法實現攔截器。其中,HandlerInterceptorAdapter類有個特殊的方法afterConcurrentHandlingStarted(),用于處理異步請求執行后進行的操作,Controller中有異步請求方法的時候會觸發該方法,不常用。
2.一種是實現WebRequestInterceptor接口,該接口相比HandlerInterceptor接口的差別在于,該接口聲明的方法,其返回值為void,這樣就不能形成攔截器鏈,進行執行了,用于資源的準備工作。它的三個方法都傳遞了同一個參數WebRequest ,這個WebRequest 是Spring 定義的一個接口,它里面的方法定義都基本跟HttpServletRequest 一樣,在WebRequestInterceptor 中對WebRequest 進行的所有操作都將同步到HttpServletRequest 中,然后在當前請求中一直傳遞。
#######WebRequest是Spring Web MVC提供的統一請求訪問接口,不僅僅可以訪問請求相關數據(如參數區數據、請求頭數據,但訪問不到Cookie區數據),還可以訪問會話和上下文中的數據;NativeWebRequest繼承了WebRequest,并提供訪問本地Servlet API的方法。
WebRequest答案:WebRequest and HttpServletRequest in Spring MVC
相關閱讀:SpringMVC強大的數據綁定(1)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
用于Web請求的通用接口。主要用于通用的Web請求的攔截,讓他們獲得一般請求元數據,沒有請求的實際處理,可以被應用到servlet請求以及portlet請求環境。
所以,基本上,你不應該使用WebRequest除了webrequestinterceptor。他們為了這個接口能夠寫攔截器應用于servlet和門戶。除此之外,如果你真的需要在Spring MVC控制器的請求,你應該使用標準的HttpServletRequest。
3.通過HandlerMapping攔截
HandlerInterceptorAdapter方法
攔截器的執行原理:
HandlerInterceptorAdapter實現了HandlerInterceptor的preHandle()、postHandle()、afterCompletion()方法,用于處理處理器方法執行前的前置初始化、預處理;處理controller后視圖渲染前的ModelAndView渲染工作,請求處理結束后回調進行的資源清理工作。其中preHandle()、postHandle()是鏈式執行的,通過返回true保證鏈的連續,postHandle()是反序調用的,且對應preHandle()方法執行了的攔截器才執行postHandle()方法。
springMVC配置文件的三種配置方法:
方法一:
<!-- 攔截器 -->
<mvc:interceptors>
<bean class="cn.yue.mvc.MyInteceptor" />
</mvc:interceptors>
interceptor配置.JPG
方法二:
<!-- 攔截匹配的url -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/*" /><bean class="cn.yue.mvc.MyInteceptor" />
</mvc:interceptor>
</mvc:interceptors>
方法三:
<!-- handlerMapping上的攔截器 -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="com.mvc.MyInteceptor">
</bean>
</list>
</property>
</bean>
注:此時不能使用<mvc:annotation-driven />