問題描述:
在代碼定義了3個過濾器,分別爲filter1,filter2,filter3,過濾的Servlet範圍分別是"/*","/Servlet1","/Servlet1",只在filter3種配置了初始化參數 預設結果爲:
filter1...進...
filter2...進...
filter3...進...
com.roxy_filter.Filter3
hello
filter3...出...
filter2...出...
filter1...出...
運行結果倒是:
filter1...進...
filter2...進...
filter2...出...
filter1...出...
問題代碼:
@WebFilter(filterName="filter3", servletNames="/Servlet1", initParams={ @WebInitParam(name="ok", value="hello") } )
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter3...進...");
System.out.println(Thread.currentThread().getStackTrace()[1].getClassName());
String v = fConfig.getInitParameter("ok");
System.out.println(v);
chain.doFilter(request, response);
System.out.println("filter3...出...");
}
問題分析:
首先將filter3的@WebFilter聲明改成和filter2一致,輸出正常,說明doFilter()方法沒有問題
仔細查看文檔,發現有兩個參數:
servletNames String[]:指定過濾器將應用於哪些 Servlet。取值是 @WebServlet 中的 name 屬性的取值,或者是 web.xml 中 <servlet-name> 的取值
urlPatterns :指定要過濾的URL模式,也可以使用屬性value來聲明.(指定要過濾的URL模式是必選屬性)
因此將servletNames="/Servlet1"改成urlPatterns ="/Servlet1",代表只對Servlet1進行過濾,運行,結果正確
問題解決:
@WebFilter(filterName="filter3", urlPattens="/Servlet1", initParams={ @WebInitParam(name="ok", value="hello") } )
問題總結:
web3.0 以後,對於servlet,filter,listener有兩種配置方式,一種是在web.xml種進行傳統的配置,另外一種是直接在類種進行註解式聲明
@WebFilter 用於將一個類聲明爲過濾器,該註解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署爲過濾器。該註解具備下表給出的一些經常使用屬性 ( 如下全部屬性均爲可選屬性,可是 value、urlPatterns、servletNames 三者必需至少包含一個,且 value 和 urlPatterns 不能共存,若是同時指定,一般忽略 value 的取值 )
屬性名 | 類型 | 描述 |
filterName | String | 指定過濾器的 name 屬性,等價於 <filter-name> |
value | String[] | 該屬性等價於 urlPatterns 屬性。可是二者不該該同時使用 |
urlPatterns | String[] | 指定一組過濾器的 URL 匹配模式。等價於 <url-pattern> 標籤 |
servletNames | String[] | 指定過濾器將應用於哪些 Servlet。取值是 @WebServlet 中的 name 屬性的取值,或者是 web.xml 中 <servlet-name> 的取值 |
dispatcherTypes | DispatcherType | 指定過濾器的轉發模式。具體取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST |
initParams | WebInitParam[] | 指定一組過濾器初始化參數,等價於 <init-param> 標籤 |
asyncSupported | boolean | 聲明過濾器是否支持異步操做模式,等價於 <async-supported> 標籤 |
description | String | 該過濾器的描述信息,等價於 <description> 標籤 |
displayName | String | 過濾器的顯示名,一般配合工具使用,等價於 <display-name> 標籤 |