1. 程式人生 > >Servlet之Filter詳細講解

Servlet之Filter詳細講解

卸載 response n) 被調用 指定 負責 傳遞 isp quest

web.xml中元素執行的順序listener->filter->struts攔截器->servlet。

Java中的Filter過濾器

Filter簡介


Java中的Filter 並不是一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。

主要用於對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行後處理,是個典型的處理鏈。

使用Filter的完整流程:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。


Filter執行流程


技術分享


Filter配置

<filter>指定一個過濾器。
<filter-name>用於為過濾器指定一個名字,該元素的內容不能為空。
<filter-class>元素用於指定過濾器的完整的限定類名。
<init-param>元素用於為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。
在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。
<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 對資源的多種調用方式進行攔截。
<dispatcher>子元素可以設置的值及其意義
REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麽該過濾器就不會被調用。
INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麽該過濾器將被調用。除此之外,該過濾器不會被調用。
FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麽該過濾器將被調用,除此之外,該過濾器不會被調用。
ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麽該過濾器將被調用。除此之外,過濾器不會被調用。

  


Filter鏈

web服務器根據Filter在web.xml文件中的註冊順序,決定先調用哪個Filter,當第一個Filter的doFilter方法被調用時,web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。


Filter的生命周期

public void init(FilterConfig filterConfig) throws ServletException;//初始化
和我們編寫的Servlet程序一樣,Filter的創建和銷毀由WEB服務器負責。 web 應用程序啟動時,web 服務器將創建Filter 的實例對象,並調用其init方法,讀取web.xml配置,
完成對象的初始化功能,從而為後續的用戶請求作好攔截的準備工作(filter對象只會創建一次,init方法也只會執行一次)。
開發人員通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//攔截請求 這個方法完成實際的過濾操作。當客戶請求訪問與過濾器關聯的URL的時候,Servlet過濾器將先執行doFilter方法。FilterChain參數用於訪問後續過濾器。 public void destroy();//銷毀 Filter對象創建後會駐留在內存,當web應用移除或服務器停止時才銷毀。在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命周期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源。

  


FilterConfig接口

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

  

Servlet之Filter詳細講解