ServletAPI中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。
通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。
下圖是filter調用關系的UML圖:
一個filter必須實現javax.servlet.Filter。
三個方法
1. voidsetFilterConfig(FilterConfig config) //設置filter 的配置對象;
2. FilterConfiggetFilterConfig() //返回filter的配置對象;
3. voiddoFilter(ServletRequest req,ServletResponse res,FilterChain chain) //執行filter的工作
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
用戶授權的Filter:Filter負責檢查用戶請求,根據請求過濾用戶非法請求。
日志Filter:詳細記錄某些特殊的用戶請求。
負責解碼的Filter:包括對非標準編碼的請求解碼。
Filter可攔截多個請求或響應;一個請求或響應也可被多個請求攔截。
創建一個Filter只需要兩個步驟:1.創建Filter處理類(如:MyFiletr)實現javax.servlet.Filter接口;2.web.xml中配置Filter
1、簡單的記錄日志的Filter,這個Filter負責攔截所符合條件的用戶請求,并將請求的信息記錄在日志中。
web.xml配置信息:
總結:上面的程序實現了doFilter()方法,實現該方法就可以實現對用戶請求進行預處理,也可以實現對服務器響應進行后處理--他們的分界線為是否調用了chain.doFilter(),執行該方法之前,即對用戶請求進行預處理;執行該方法之后,即對服務器響應進行后處理。
在上面的請求Filter中,僅在日志中記錄請求的URL,對所有的請求都執行chain.doFilter (request,reponse)方法,當Filter對請求過濾后,依然將請求發送到目的地址。如果需要檢查權限,可以在Filter中根據用戶請求的HttpSession,判斷用戶權限是否足夠。如果權限不夠,直接調用重定向即可,無須調用chain.doFilter(request,reponse)方法。
2、簡單的認證登錄Filter。
web.xml配置信息:
3、再次闡述Filter及一個應用小例子。
Filter也稱之為過濾器,它是Servlet技術中比較激動人心的技術,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。
Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個Java類稱之為過濾器Filter。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲處理。
web.xml配置信息:
Filter接口中有一個doFilter方法,當開發人員編寫好Filter類實現doFilter方法,并配置對哪個web資源進行攔截后,WEB服務器每次在調用web資源的service方法之前(服務器內部對資源的訪問機制決定的),都會先調用一下filter的doFilter方法。
Filter的生命周期和Servlet一樣,Filter的創建和銷毀也是由WEB服務器負責。不過與Servlet區別的是,它是1>在應用啟動的時候就進行裝載Filter類(與Servlet的load-on-startup配置效果相同)。2>容器創建好Filter對象實例后,調用init()方法。接著被Web容器保存進應用級的集合容器中去了等待著,用戶訪問資源。3>當用戶訪問的資源正好被Filter的url-pattern攔截時,容器會取出Filter類調用doFilter方法,下次或多次訪問被攔截的資源時,Web容器會直接取出指定Filter對象實例調用doFilter方法(Filter對象常駐留Web容器了)。4>當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter對象銷毀。注意:init方法與destroy方法只會直接一次。
Filter不僅可以通過url-pattern來指定攔截哪些url匹配的資源。而且還可以通過servlet-name來指定攔截哪個指定的servlet(專門為某個servlet服務了,servlet-name對應Servlet的相關配置)。