IT兄弟連 JavaWeb教程 過濾器1
- 2019 年 10 月 5 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/ITXDL123/article/details/90718915
Servlet過濾器是從Servlet2.3規範開始新增的功能,並在Servlet2.4規範中得到增強,監聽器可以監聽到Web應用程式啟動和關閉。創建過濾器和監聽器需要繼承相應介面,並對其進行配置。
過濾器
在現實生活中,自來水都是經過一層層過濾處理才達到食用標準的,每一層過濾都起到一種凈化的作用。JavaWeb中的Servlet過濾器與自來水被過濾的原理相似,Servlet過濾器主要用於對客戶端(瀏覽器)的請求進行過濾處理,現將過濾後的請求轉交給下一個資源,它在JavaWeb開發中具有十分重要的作用。
1 過濾器的定義
Servlet過濾器與Servlet十分相似,但它具有攔截客戶端(瀏覽器)請求的功能,Servlet過濾器可以改變請求中的內容來滿足開發中的需要。對於程式開發人員而言,過濾器實質上就是在Web應用伺服器上的一個Web應用組件,用於攔截客戶端(瀏覽器)與目標資源的請求,並對這些請求進行一定過濾處理再發送給目標資源。過濾器的處理方式如圖1所示。

圖1 過濾器
從上圖可以看出,在Web伺服器中部署了過濾器後,不僅客戶端發送的請求會經過過濾器的處理,而且請求在發送到目標資源處理以後,請求的回應資訊也同樣要經過過濾器。
過濾器對象放置在javax.servlet包中,其名稱為Filter,它是一個介面。除這個介面外,與過濾器相關的對象還有FilterConfig對象與FilterChain對象,這兩個對象也同樣是介面對象,位於javax.servlet包中,分別為過濾器的配置對象與過濾器的傳遞工具。在實際開發中,定義過濾器對象只需要直接或間接地實現Filter介面即可。
Filter介面:
每一個過濾器對象都要直接或間接地實現Filter介面,在Filter介面中定義了3個方法,分別為init()方法,doFilter()方法和destroy()方法,其方法聲明及說明如下:
● 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>一一對應。