Servlet 過濾器能夠動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。能夠將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也能夠附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。調用 Servlet 前調用全部附加的 Servlet 過濾器。java
當 Web 容器啓動 Web 應用程序時,它會爲您在部署描述符中聲明的每個過濾器建立一個實例。Filter 的執行順序與在web.xml配置文件中的配置順序一致,通常把 Filter 配置在全部的 Servlet 以前。web
過濾器是一個實現了 javax.servlet.Filter 接口的 Java 類。javax.servlet.Filter 接口定義了三個方法:後端
public void doFilter (ServletRequest, ServletResponse, FilterChain)
: 該方法完成實際的過濾操做,當客戶端請求方法與過濾器設置匹配的URL時,Servlet容器將先調用過濾器的doFilter方法。FilterChain 用戶訪問後續過濾器public void init(FilterConfig filterConfig)
: web 應用程序啓動時,web 服務器將建立Filter 的實例對象,並調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而爲後續的用戶請求做好攔截的準備工做(filter對象只會建立一次,init方法也只會執行一次)。開發人員經過init方法的參數,可得到表明當前 filter 配置信息的 FilterConfig 對象public void destroy()
: Servlet容器在銷燬過濾器實例前調用該方法,在該方法中釋放Servlet過濾器佔用的資源
請求 --> 匹配過濾器 --> doFilter() --> servlet響應前的過濾 --> chain鏈(servlet響應) --> servlet響應後的過濾服務器
Filter 的 init 方法中提供了一個 FilterConfig 對象。app
註解方式配置 FilterConfig:網站
1 @WebFilter( 2 filterName = "loginFilter", 3 urlPatterns = "/*", 4 initParams = { 5 @WebInitParam(name = "loginUI", value = "/home/loginUI"), 6 @WebInitParam(name = "loginProcess", value = "home/login"), 7 @WebInitParam(name = "encoding", value = "utf-8") 8 } 9 )
web.xml 文件配置 FilterConfig:url
1 <filter> 2 <filter-name>LogFilter</filter-name> 3 <filter-class>com.xxx.test.LogFilter</filter-class> 4 <init-param> 5 <param-name>site</param-name> 6 <param-value>知乎</param-value> 7 </init-param> 8 </filter>
在 init 方法使用 FilterConfig 對象獲取參數:spa
1 public void init(FilterConfig config) throws ServletException { 2 // 獲取初始化參數 3 String site = config.getInitParameter("Site"); 4 // 輸出初始化參數 5 System.out.println("網站名稱: " + site); 6 }
<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。用戶能夠設置多個子元素用來指定 Filter 對資源的多種調用方式進行攔截。當一個 Servlet 拋出一個異常時,Web 容器在使用了 exception-type 元素的 web.xml 中搜索與拋出異常類型相匹配的配置。web.xml 中使用 error-page 元素來指定對特定異常 或 HTTP 狀態碼 做出相應的 Servlet 調用。code
假設,有一個 ErrorHandler 的 Servlet 在任何已定義的異常或錯誤出現時被調用。如下將是在 web.xml 中建立的項。orm
1 <!-- servlet 定義 --> 2 <servlet> 3 <servlet-name>ErrorHandler</servlet-name> 4 <servlet-class>ErrorHandler</servlet-class> 5 </servlet> 6 <!-- servlet 映射 --> 7 <servlet-mapping> 8 <servlet-name>ErrorHandler</servlet-name> 9 <url-pattern>/ErrorHandler</url-pattern> 10 </servlet-mapping> 11 12 <!-- error-code 相關的錯誤頁面 --> 13 <error-page> 14 <error-code>404</error-code> 15 <location>/ErrorHandler</location> 16 </error-page> 17 <error-page> 18 <error-code>403</error-code> 19 <location>/ErrorHandler</location> 20 </error-page> 21 22 <!-- exception-type 相關的錯誤頁面 --> 23 <error-page> 24 <exception-type>javax.servlet.ServletException</exception-type > 25 <location>/ErrorHandler</location> 26 </error-page> 27 <error-page> 28 <exception-type>java.io.IOException</exception-type > 29 <location>/ErrorHandler</location> 30 </error-page>
若是您想對全部的異常有一個通用的錯誤處理程序,那麼應該定義下面的 error-page,而不是爲每一個異常定義單獨的 error-page 元素:
1 <error-page> 2 <exception-type>java.lang.Throwable</exception-type > 3 <location>/ErrorHandler</location> 4 </error-page>