IT兄弟連 JavaWeb教程 過濾器1

Servlet過濾器是從Servlet2.3規範開始新增的功能,並在Servlet2.4規範中獲得加強,監聽器能夠監聽到Web應用程序啓動和關閉。建立過濾器和監聽器須要繼承相應接口,並對其進行配置。java

過濾器web

在現實生活中,自來水都是通過一層層過濾處理才達到食用標準的,每一層過濾都起到一種淨化的做用。JavaWeb中的Servlet過濾器與自來水被過濾的原理類似,Servlet過濾器主要用於對客戶端(瀏覽器)的請求進行過濾處理,現將過濾後的請求轉交給下一個資源,它在JavaWeb開發中具備十分重要的做用。瀏覽器

 

1  過濾器的定義服務器

Servlet過濾器與Servlet十分類似,但它具備攔截客戶端(瀏覽器)請求的功能,Servlet過濾器能夠改變請求中的內容來知足開發中的須要。對於程序開發人員而言,過濾器實質上就是在Web應用服務器上的一個Web應用組件,用於攔截客戶端(瀏覽器)與目標資源的請求,並對這些請求進行必定過濾處理再發送給目標資源。過濾器的處理方式如圖1所示。app

b233ef8127fe496a84965f1a9edd7426.png

圖1  過濾器工具

 

從上圖能夠看出,在Web服務器中部署了過濾器後,不只客戶端發送的請求會通過過濾器的處理,並且請求在發送到目標資源處理之後,請求的迴應信息也一樣要通過過濾器。url

過濾器對象放置在javax.servlet包中,其名稱爲Filter,它是一個接口。除這個接口外,與過濾器相關的對象還有FilterConfig對象與FilterChain對象,這兩個對象也一樣是接口對象,位於javax.servlet包中,分別爲過濾器的配置對象與過濾器的傳遞工具。在實際開發中,定義過濾器對象只須要直接或間接地實現Filter接口便可。xml

Filter接口:對象

每個過濾器對象都要直接或間接地實現Filter接口,在Filter接口中定義了3個方法,分別爲init()方法,doFilter()方法和destroy()方法,其方法聲明及說明以下:blog

●  public void init(FilterConfig config)throws ServletException

過濾器初始化方法,該方法在過濾器初始化時調用

●  public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)thrwos IOException,ServletException

對請求進行過濾處理

●  public void destroy()

銷燬方法,以便釋放資源

FilterConfig接口:

FilterConfig接口有Servlet容器進行實現,主要用於獲取過濾器中的配置信息,其方法聲明及說明以下:

●  public String getFilterName()

用於獲取過濾器的名字

●  public ServletContext getServletContext()

獲取Servlet上下文

●  public String getInitParameter(String name)

獲取過濾器的初始化參數值

●  public Enumeration getInitParameterNames()

獲取過濾器的全部初始化參數

FilterChain接口:

FilterChain接口仍然由Servlet容器進行實現,在這個接口中只有一個方法,其方法聲明以下:

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

該方法用於將過濾後的請求傳遞給下一個過濾器,若是此過濾器已是過濾器鏈中的最後一個過濾器,那麼,請求將傳送給目標資源。

 

2  過濾器實現步驟

建立一個過濾器對象須要實現javax.servlet.Filter接口,同時實現Filter接口的3個方法,下面的例子演示了過濾器的建立。

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class MyFilter implements Filter{

    //初始化方法

    public void init(FilterConfig fConfig)throws ServletException{

         //初始化處理

    }

    public void doFilter(ServletRequest request,ServletResponse response,

            FilterChain chain)throws IOException,ServletException{

         //過濾處理

         chain.doFilter(request,response);

    }

    public void destroy(){

         //釋放資源

    }

}

過濾器中的init()方法用於對過濾器的初始化進行處理,destroy()方法是過濾器的銷燬方法,用於釋放資源,對於過濾處理的業務邏輯須要編寫到doFilter()方法中,在請求過濾處理後,須要調用chain參數的doFilter()方法將請求向下傳遞給下一個過濾器或目標資源。

使用過濾器並不必定要將請求向下傳遞到下一個過濾器或目標資源,若是業務邏輯須要,也能夠在過濾處理後,直接回應與客戶端。

過濾器與Servlet十分類似,在建立以後一樣須要對其在web.xml中進行配置,過濾器的配置主要分爲兩個步驟,分別爲聲明過濾器對象和建立過濾器映射。下面的代碼演示過濾器的配置。

<filter>

    <filter-name>MyFilter</filter-name>

    <filter-class>com.xdl.filter.MyFilter</filter-class>

</filter>

<filter-mapping>

    <filter-name>MyFilter</filter-name>

    <url-pattern>/MyFilter</url-pattern>

</filter-mapping>

<filter>標籤用於聲明過濾器對象,在這個標籤中必須配置兩個子元素,分別爲過濾器的名稱與過濾器完整類名,其中<filter-name>用於定義過濾器的名稱,<filter-class>用於指定過濾器的完整類名。

<filter-mapping>標籤用於建立過濾器的映射,它的主要做用就是指定Web應用中,那些URL應用哪個過濾器進行處理。在<filter-mapping>標籤中須要指定過濾器的名稱與過濾器的URL映射,其中<filter-name>用於定義過濾器的名稱,<url-pattern>用於指定過濾器應用的URL。

<filter>標籤中的<filter-name>能夠是自定義的名稱,而<filter-mapping>標籤中的<filter-name>是指定已經定義的過濾器的名稱,它須要與<filter>標籤中的<filter-name>一一對應。

相關文章
相關標籤/搜索