程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> web.xml學習(3)_filter

web.xml學習(3)_filter

編輯:關於ASP.NET

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>
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved