1. 程式人生 > >Servlet-filter過濾器

Servlet-filter過濾器

Filter的建立過程

實現javax.servlet.Filter介面
實現init方法,讀取過濾器的初始化引數
實現doFilter方法,完成對請求或響應的過濾
呼叫FilterChain介面物件的doFilter方法,向後續的過濾器傳遞請求或響應

實現過濾器

在Servlet中,如果要定義一個過濾器,則直接讓一個類實現javax.servlet.Filter介面即可,此介面定義了三個操作方法:

* public void init(FilterConfig filterConfig) throws ServletException
* public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException
* public void destroy()

FilterChain介面的主要作用是將使用者的請求向下傳遞給其他的過濾器或者是Servlet:

* public void doFilter(ServletRequest request,ServletResponse response) throws IOException,ServletException

Filter的建立

Filter的建立和銷燬由WEB伺服器負責。 web 應用程式啟動時,web 伺服器將建立Filter 的例項物件,並呼叫其init方法,完成物件的初始化功能,從而為後續的使用者請求作好攔截的準備工作,filter物件只會建立一次,init方法也只會執行一次。通過init方法的引數,可獲得代表當前filter配置資訊的FilterConfig物件。Filter的銷燬
  Web容器呼叫destroy方法銷燬Filter。destroy方法在Filter的生命週期中僅執行一次。在destroy方法中,可以釋放過濾器使用的資源。
FilterConfig介面

使用者在配置filter時,可以使用為filter配置一些初始化引數,當web容器例項化Filter物件,呼叫其init方法時,會把封裝了filter初始化引數的filterConfig物件傳遞進來。因此開發人員在編寫filter時,通過filterConfig物件的方法,就可獲得:

String getFilterName():得到filter的名稱。
String getInitParameter(String name): 返回在部署描述中指定名稱的初始化引數的值。如果不存在返回null.
Enumeration getInitParameterNames():返回過濾器的所有初始化引數的名字的列舉集合。
public ServletContext getServletContext():返回Servlet上下文物件的引用。

Filter的部署

Filter的部署分為兩個步驟:
  1、註冊Filter
  2、對映Filter註冊Filter
開發好Filter之後,需要在web.xml檔案中進行註冊,這樣才能夠被web伺服器呼叫

在web.xml檔案中註冊Filter範例:

1 <filter>
2 <description>FilterDemo02過濾器</description>
3 <filter-name>FilterDemo02</filter-name>
4 <filter-class>me.gacl.web.filter.FilterDemo02</filter-class>
5 <!--配置FilterDemo02過濾器的初始化引數-->
6 <init-param>
7 <description>配置FilterDemo02過濾器的初始化引數</description>
8 <param-name>name</param-name>
9 <param-value>gacl</param-value>
10 </init-param>
11 <init-param>
12 <description>配置FilterDemo02過濾器的初始化引數</description>
13 <param-name>like</param-name>
14 <param-value>java</param-value>
15 </init-param>
16 </filter>
<description>用於新增描述資訊,該元素的內容可為空,<description>可以不配置。
<filter-name>用於為過濾器指定一個名字,該元素的內容不能為空。
<filter-class>元素用於指定過濾器的完整的限定類名。
<init-param>元素用於為過濾器指定初始化引數,它的子元素<param-name>指定引數的名字,<param-value>指定引數的值。在過濾器中,可以使用FilterConfig介面物件來訪問初始化引數。如果過濾器不需要指定初始化引數,那麼<init-param>元素可以不配置。

在web.xml檔案中註冊了Filter之後,還要在web.xml檔案中對映Filter

1 <!--對映過濾器-->
2 <filter-mapping>
3 <filter-name>FilterDemo02</filter-name>
4 <!--“/*”表示攔截所有的請求 -->
5 <url-pattern>/*</url-pattern>
6 </filter-mapping>
<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 對資源的多種呼叫方式進行攔截。如下:
1 <filter-mapping>
2 <filter-name>testFilter</filter-name>
3 <url-pattern>/index.jsp</url-pattern>
4 <dispatcher>REQUEST</dispatcher>
5 <dispatcher>FORWARD</dispatcher>
6 </filter-mapping>

<dispatcher> 子元素可以設定的值及其意義:
1. REQUEST:當用戶直接訪問頁面時,Web容器將會呼叫過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麼該過濾器就不會被呼叫。
2. INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被呼叫。除此之外,該過濾器不會被呼叫。
3. FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被呼叫,除此之外,該過濾器不會被呼叫。
4. ERROR:如果目標資源是通過宣告式異常處理機制呼叫時,那麼該過濾器將被呼叫。除此之外,過濾器不會被呼叫。