概述
過濾器(Filter)
過濾器實際上就是對web資源進行攔截,做一些處理后再交給下一個過濾器或servlet處理
通常都是用來攔截request進行處理的,也可以對返回的response進行攔截處理。
攔截器(Interceptor)
攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前后執行一段代碼,也可以在一個Action執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用於在某個方法或者字段被訪問之前,進行攔截然后再之前或者之后加入某些操作。
區別與聯系
區別
- 過濾器是基於函數回調,而攔截器是基於java的反射機制;
- 過濾器是servlet規范規定的,只能用於web程序中,而攔截器是在spring容器中,它不依賴servlet容器;
- 過濾器可以攔截幾乎所有的請求(包含對靜態資源的請求),而攔截器只攔截action請求(不攔截靜態資源請求);
- 過濾器不能訪問action上下文及值棧里的對象,而攔截器都是可以的;
- 攔截器可以獲取spring容器里的對象,而過濾器是不行;
- 攔截器在action的生命周期內是可以多次調用,而過濾器只在容器初始化時被調用一次;
聯系
- 攔截器是被包裹在過濾器之中;
總結
Filter
所謂過濾器顧名思義是用來過濾的,Java的過濾器能夠為我們提供系統級別的過濾,也就是說,能過濾所有的web請求,這一點,是攔截器無法做到的。在Java Web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts的action進行業務邏輯。
比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts的action前統一設置字符集,或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。filter 流程是線性的,url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收。
Interceptor
java里的攔截器提供的是非系統級別的攔截,也就是說,就覆蓋面來說,攔截器不如過濾器強大,但是更有針對性。
Java中的攔截器是基於Java反射機制實現的,更准確的划分,應該是基於JDK實現的動態代理。它依賴於具體的接口,在運行期間動態生成字節碼。
攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前后執行一段代碼,也可以在一個Action執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用於在某個方法或者字段被訪問之前,進行攔截然后再之前或者之后加入某些操作。