標籤:上下文 col src lan pos reg article test exe
1.概念
java裡的攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發人員在一個Action執行的前後執行一段代碼,也可以在一個Action執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用於在某個方法或者欄位被訪問之前,進行攔截然後再之前或者之後加入某些操作。
目前,我們需要掌握的主要是Spring的攔截器,Struts2的攔截器不用深究,知道即可。
2.攔截器與過濾器區別
- filter基於回呼函數,我們需要實現的filter介面中doFilter方法就是回呼函數,而interceptor則基於java本身的反射機制,這是兩者最本質的區別
- 過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
- Filter的過濾範圍比Interceptor大,Filter除了過濾請求外通過萬用字元可以保護頁面,圖片,檔案等等,而Interceptor只能過濾請求。
- 攔截器可以訪問action上下文、值棧裡的對象,而過濾器不能
- 在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
3.Spring攔截器
spring中攔截器主要分兩種,一個是HandlerInterceptor,一個是MethodInterceptor。
3.1 HandlerInterceptor
public interface HandlerInterceptor { boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception; void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception; void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;}
HandlerInterceptor是springMVC項目中的攔截器,它攔截的目標是請求的地址,比MethodInterceptor先執行。
使用HandlerInterceptor步驟:
- 實現一個HandlerInterceptor攔截器可以直接實現HandlerInterceptor介面,也可以繼承HandlerInterceptorAdapter類。
- 在springMVC設定檔中配置攔截器
代碼執行個體:
public class HandlerInterceptorDemo implements HandlerInterceptor { @Override public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("--------HandlerInterceptor.preHandle---------"); return true; } @Override public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("--------HandlerInterceptor.postHandle---------"); } @Override public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("--------HandlerInterceptor.afterCompletion---------"); }}
<mvc:interceptors> <!-- 在這裡配置攔截器將對所有請求都攔截,公用攔截器可以有多個 --> <mvc:interceptor> <!-- 對/test進行攔截 --> <mvc:mapping path="/test"/> <!-- 特定請求的攔截器只能有一個 --> <bean class="com.xzh.HandlerInterceptorDemo" /> </mvc:interceptor> </mvc:interceptors>
測試結果:
3.2 MethodInterceptor
public interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation var1) throws Throwable;}
MethodInterceptor是AOP項目中的攔截器,它攔截的目標是方法,即使不是controller中的方法。
使用MethodInterceptor步驟:
- 實現MethodInterceptor介面,或利用AspectJ的註解
- 在spring設定檔中配置
代碼執行個體:
@Componentpublic class MethodInterceptorDemo implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("-------MethodInterceptorDemo.invoke--------"); Method method = methodInvocation.getMethod(); System.out.println("-------method:"+ method.getName() + "-------"); return methodInvocation.proceed();//該方法不調用,則被攔截的方法不會被執行 }}
<aop:config> <!--切入點--> <aop:pointcut id="methodPoint" expression="execution(* com.xzh.*Controller.*(..)) "/><!--在該切入點使用自訂攔截器--> <aop:advisor pointcut-ref="methodPoint" advice-ref="methodInterceptorDemo"/> </aop:config>
測試結果:
參考:
Java三大器之攔截器(Interceptor)的實現原理及程式碼範例
談談spring中的攔截器interceptor
spring方法攔截器 MethodInterceptor 配置
JavaWeb學習筆記—Interceptor