Servlet過濾器是從Servlet2.3規范開始新增的功能,並在Servlet2.4規范中得到增強,監聽器可以監聽到Web應用程序啟動和關閉。創建監聽器需要實現響應的接口,並對其進行配置。
Servlet過濾器與Servlet十分相似,但是它具有攔截客戶端請求的功能。Servlet過濾器可以改變請求中的內容,來滿足實際開發中的需要。對於程序開發人員來說,過濾器實質上就是在Web應用服務器上的一個Web應用組件,用於攔截客戶端與目標資源之間的請求,並對這些請求進行過濾處理再發送給目標資源。
如果在一個Web應用中使用一個過濾器不能解決問題,可以部署多個過濾器對業務請求進行多次處理。這樣就形成一個過濾器鏈,在Web容器處理過濾器鏈時,將按照過濾器的先後順序對請求進行處理。
過濾器對象放在javax.servlet包中,其名為Filter,它是一個接口,除了這個接口外,與過濾器相關的對象還有FilterConfig對象與FilterChain對象,這兩個對象也同樣是接口,為位於javax.servlet包中,分別為過濾器的配置對象和過濾器的傳遞工具。在實際開發過程中,定義過濾器只要直接或間接的實現Filter接口即可。而FilterChain和FilterConfig用於對過濾器的相關操作。
每一個過濾器都要直接或間接的實現Filter接口,在Filter接口中,定義了3個方法,分別為init(),doFilter(),destroy()。對應的方法說明如下:
方法聲明
說明
public void init(FilterConfig filterConfig) throws ServlerException
過濾器初始化,該方法在過濾器初始化時調用
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException
對請求進行過濾處理
public void destroy()
銷毀方法,以便釋放資源
FilterConfig接口由Servlet容器進行實現,主要用於獲取過濾器中的配置信息。其方法說明如下:
方法聲明
說明
Public String getFilterName()
用於獲取過濾器的名字
Public ServletContext getServletContext()
獲取Servlet上下文
Public String getInitParameter(String name)
獲取過濾器的初始化參數的值
Public Enumeration getInitParameterNames()
獲取過濾器所有的初始化參數
FilterChain接口也是由Servlet容器實現的,在這個接口中只有一個方法,其方法聲明為:public void doFilter(ServletRuquest request,ServletResponse response) throws IOException,ServletException
該方法用於將過濾後的請求傳遞給下一個過濾器,如果此過濾器已經是過濾器中的最後一個過濾器,那麼,請求將傳送給目標資源。
創建也該過濾器需要實現javax.servlet.Filter接口,同時實現接口的3個方法。
范例:
package com.zgy.filter;
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 {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
使用過濾器不一定要將請求傳遞到下一個過濾器,如果業務邏輯需要,也可以在過濾器處理完後,直接回應客戶端
創建名稱為MyServlet的過濾對象,其web.xml的配置如下:
PS: