攔截器

java里的攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。

原理

大部分時候,攔截器方法都是通過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置檔案,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器。Struts2攔截器是可插拔的,攔截器是AOP的一種實現。Struts2攔截器棧就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,Struts2攔截器鏈中的攔截器就會按其之前定義的順序被調用。

定義一個攔截器

自定義一個攔截器需要三步:

1 .自定義一個實現Interceptor接口(或者繼承自AbstractInterceptor)的類。

2 .在struts.xml中註冊上一步中定義的攔截器。

3 .在需要使用的Action中引用上述定義的攔截器,為了方便也可將攔截器定義為默認的攔截器,這樣在不加特殊聲明的情況下所有的Action都被這個攔截器攔截。  

與過濾器的區別

過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感辭彙。

1.攔截器是基於java反射機制的,而過濾器是基於函式回調的。

2.過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。

3.攔截器只對action起作用,而過濾器幾乎可以對所有請求起作用。

4.攔截器可以訪問action上下文、值棧里的對象,而過濾器不能。

5.在action的生命周期里,攔截器可以多起調用,而過濾器只能在容器初始化時調用一次。

相關詞條

熱門詞條

聯絡我們