Servlet3.0過濾器
Servlet3.0裏面的過濾器跟以前版本的一樣,還是需要實現javax.servlet.Filter接口。Filter接口中定義了三個方法,init(FilterConfig filterConfig)、destroy()和doFilter(HttpRequest request, HttpServletResponse response, FilterChain chain)。
init()方法會在Filter初始化後進行調用,在init()方法裏面我們可以通過FilterConfig訪問到初始化參數(getInitParameter()或getInitParameters())、ServletContext(getServletContext)和當前Filter部署的名稱(getFilterName())等信息。destroy()方法將在Filter被銷燬之前調用。而doFilter()方法則是真正進行過濾處理的方法,在doFilter()方法內部,我們可以過濾請求的request和返回的response,同時我們還可以利用FilterChain把當前的request和response傳遞給下一個過濾器或Servlet進行處理。
public class ExampleFilter implements Filter {
@Override
public void destroy() {
System.out.println("destory filter……");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("filter……");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param1 = filterConfig.getInitParameter("param1");
System.out.println("filter init……" + param1);
}
}
至於Filter的配置,在Servlet3.0中我們除了使用傳統的方式在web.xml文件中進行配置以外,還可以使用註解的方式進行配置。使用註解的方式配置時我們需要在Filter實現類上用@WebFilter註解進行標註,然後指定其urlPatterns屬性或者value屬性。@WebFilter註解的可配置屬性和@WebServlet的可配置屬性基本上是差不多的。在@WebFilter中urlPatterns屬性和value屬性都可以用來指定當前Filter要過濾的請求地址,且它們都是數組形式,支持同時指定多個地址進行過濾,但是不能同時指定urlPatterns屬性和value屬性,如果同時指定了urlPatterns屬性和value屬性則請求地址過濾會失效,這個時候就只能通過servletNames來進行過濾了。除了urlPatterns屬性和value屬性外,@WebFilter還可以指定以下幾個比較重要的屬性:
l initParams:用於指定初始化參數的,其內容是一個@WebInitParam數組,其中每一個@WebInitParam代表一個初始化參數。
l asyncSupported:表示是否支持異步調用,默認是false,關於Servlet3.0中的異步調用請參考我的另一篇文章(Servlet3.0中Servlet的使用)。有一點需要注意的地方是如果Filter的asyncSupported指定爲false,那麼經過Filter過濾後的request將不再支持異步調用了。
l dispatcherTypes:指定Filter需要過濾的dispatcher類型,它是一個數組類型,裏面的每一個元素都是枚舉DispatcherType的一個元素。支持的元素有ASYNC、ERROR、REQUEST、FORWARD和INCLUDE,默認是REQUEST。
l servletNames:字符串數組類型,指定需要過濾的servlet名稱。servletNames過濾跟url過濾是不一樣的,如果指定的servletNames跟urlPatterns或value有重複的,則當前過濾器會執行兩次。
使用註解進行配置:
@WebFilter(urlPatterns={"/servlet/*"}, asyncSupported=true, dispatcherTypes={DispatcherType.REQUEST},
initParams=@WebInitParam(name="param1", value="value1"))
public class ExampleFilter implements Filter {
@Override
public void destroy() {
System.out.println("destory filter……");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("filter……");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param1 = filterConfig.getInitParameter("param1");
System.out.println("filter init……" + param1);
}
}
在web.xml中進行配置:
<filter> <filter-name>example</filter-name> <async-supported>true</async-supported> <filter-class>com.xxx.ExampleFilter</filter-class> <init-param> <param-name>param1</param-name> <param-value>value1</param-value> </init-param> </filter> <filter-mapping> <filter-name>example</filter-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <servlet-name>exampleServlet</servlet-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>