Servlet過濾器是從Servlet2.3規範開始新增的功能,並在Servlet2.4規範中獲得加強,監聽器能夠監聽到Web應用程序啓動和關閉。建立過濾器和監聽器須要繼承相應接口,並對其進行配置。java
過濾器web
在現實生活中,自來水都是通過一層層過濾處理才達到食用標準的,每一層過濾都起到一種淨化的做用。JavaWeb中的Servlet過濾器與自來水被過濾的原理類似,Servlet過濾器主要用於對客戶端(瀏覽器)的請求進行過濾處理,現將過濾後的請求轉交給下一個資源,它在JavaWeb開發中具備十分重要的做用。瀏覽器
1 過濾器的定義服務器
Servlet過濾器與Servlet十分類似,但它具備攔截客戶端(瀏覽器)請求的功能,Servlet過濾器能夠改變請求中的內容來知足開發中的須要。對於程序開發人員而言,過濾器實質上就是在Web應用服務器上的一個Web應用組件,用於攔截客戶端(瀏覽器)與目標資源的請求,並對這些請求進行必定過濾處理再發送給目標資源。過濾器的處理方式如圖1所示。app
圖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>一一對應。