Filter介紹
Filter可認為是Servlet的一種“變種”,它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。
Filter有如下幾個用處。
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
Filter有如下幾個種類。
用戶授權的Filter:Filter負責檢查用戶請求,根據請求過濾用戶非法請求。
日志Filter:詳細記錄某些特殊的用戶請求。
負責解碼的Filter:包括對非標准編碼的請求解碼。
能改變XML內容的XSLT Filter等。
Filter可負責攔截多個請求或響應;一個請求或響應也可被多個請求攔截。
創建一個Filter只需兩個步驟:
建Filter處理類;
web.xml文件中配置Filter。
6.filter:過濾器配置:將一個名字與一個實現javaxs.servlet.Filter接口的類相關聯
在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。
web服務器根據Filter在web.xml文件中的注冊順序,決定先調用哪個Filter,
當第一個Filter的doFilter方法被調用時,web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。
在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,
如果有,則調用第2個filter,如果沒有,則調用目標資源。
<filter> <filter-name>testFitler</filter-name> <filter-class>org.test.TestFiter</filter-class> <init-param> <param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</param-value> </init-param> </filter>
<filter-name>用於為過濾器指定一個名字,該元素的內容不能為空。
<filter-class>元素用於指定過濾器的完整的限定類名。
<init-param>元素用於為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。
在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。
FilterConfig接口:
用戶在配置filter時,可以使用<init-param>為filter配置一些初始化參數,
當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。
因此開發人員在編寫filter時,通過filterConfig對象的方法,就可獲得:
String getFilterName():得到filter的名稱。
String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.
Enumeration getInitParameterNames():返回過濾器的所有初始化參數的名字的枚舉集合。
public ServletContext getServletContext():返回Servlet上下文對象的引用。
<filter-mapping>元素用於設置一個 Filter 所負責攔截的資源。
一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑
<filter-name>子元素用於設置filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
<url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
<servlet-name>指定過濾器所攔截的Servlet名稱。
<dispatcher>指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,
默認REQUEST。用戶可以設置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。
<dispatcher> 子元素可以設置的值及其意義:
REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麼該過濾器就不會被調用。
INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。
FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。
ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用。
<filter> <!-- 定義Filter的名稱. --> <filter-name>URIFilter</filter-name> <!-- 定義Filter的類名稱 --> <filter-class>org.cjj.filter.URIFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- filter-mapping 元素的兩個主要子元素filter-name和url-pattern.用來定義Filter所對應的URL.和下面的servlet-mapping一樣 --> <filter-mapping> <!-- 定義Filter的名稱,和上面定義的Filter名稱要一致 --> <filter-name>URIFilter</filter-name> <!-- ilter所對應的RUL,這裡是所有的URL --> <url-pattern>/*</url-pattern> </filter-mapping>