一、簡介
Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp,Servlet,靜態圖片文件或靜態html文件進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮相印信息等一些高級功能。
Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。
Filter接口共定義了如下方法:
destroy()、doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)、init(FilterConfig filterConfig);
二、filter在開發中的常見應用
1、filter可以在目標資源執行之前,運行權限檢查,檢查用戶有無權限。選擇是否放行。
2、filter可以在放行之前,對request和response進行預處理,從而實現一些全局性的設置。
3、filter在放行之后,可以捕獲到目標資源的輸出,從而對輸出做類似于壓縮這樣的設置。
三、filter鏈
多個filter組成filter鏈。按順序依次執行。
執行先后次序按照web.xml中<filter-mapping>位置的先后順序。
四、filter生命周期
init()方法執行時filter創建,服務器在啟動時就執行filter的init()方法創建了該filter對象,該對象被所有的攔截請求所共享。
distroy()方法執行時filter被摧毀,當移除服務器中的web應用或者停止服務器時服務器調用distroy()方法摧毀filter。
五、filter()初始化參數
<filter><init-param><param-name></><param-value></></></>
服務器啟動時會將參數封裝到filterConfig中并傳遞給init方法,供filter調用。
六、filter增強
對一個對象增強一般共有如下三種方式:
1、寫子類
2、用包裝模式
3、動態代理
包裝模式五步:1、寫一個類,實現與被增強對象相同的接口;2、定義一個變量,記住被增強對象;3、定義一個構造方法,接受被增強對象;4、覆蓋需要增強的方法;5、對于不需要增強的方法,直接調用被增強對象(目標對象)的方法
可使用包裝模式實現對doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)中的ServeltRequest、ServletResponse對象增強;
例如對ServletRequest的getParamter()方法增強來解決全棧的get方式的請求的亂碼問題;
?七、Filter映射<dispatcher>
filter配置中<filter-mapping>中可包含<dispatcher>元素,該元素用于指定過濾器攔截的資源被Servlet容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST。用戶可以設置多個<dispatcher>子元素用來指定Filter對資源的多種調用方式進行攔截。
web資源調用共四種方式,即上述四種,
REQUEST攔截器介于服務器與request請求的資源之間,該攔截器作用于request請求資源時。
INCLUDE,FORWARD攔截器介于服務器與被包含的資源及轉發的資源之間,該攔截器作用于訪問資源中有include、forward標志時服務器調用指定頁面(資源)。
ERROR攔截器介于服務器與錯誤資源之間,該攔截器作用于訪問資源發生錯誤并向服務器拋出異常時,服務器調用對應的錯誤處理頁面(資源)。