简介
过滤器的基本概念是拦截和修改servlet或JSP页面的输入请求和输出响应。本文将介绍如何在web.xml中配置过滤器。
过滤器实例
在一个servlet或JSP页面执行之前,第一个关联的过滤器的doFilter方法率先执行。该过滤器调用FilterChain对象doFilter方法之后,下一个过滤器将被执行。如果没有其它过滤器,就执行servlet或JSP页面。过滤器已经完全访问进入ServletRequest对象,所以他们可以查找客户端的主机名,查找进入的cookie等。为访问servlet或者JSP页面的输出,过滤器可以将响应对象封装到一个替代的对象中,如将内容输出集中到缓存中。在调用FilterChain对象的doFilter方法之后,这个过滤器可以检查缓存,并在必要时修改,然后将输出到客户端。
package coreservlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
/**
* Simple filter that prints a report on the standard output whenever the
* associated servlet or JSP page is accessed.
*/
public class ReportFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println(req.getRemoteHost() + " tried to access "
+ req.getRequestURL() + " on " + new Date() + ".");
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
}
声明过滤器
一旦创建好了过滤器,就需要在web.xml文件中使用filter元素和filter-name(任意名)、filter-class(完全限定类名)、可选的init-param子元素来声明过滤器。
<!-- Register the name "Reporter" for ReportFilter. -->
<filter>
<filter-name>Reporter</filter-name>
<filter-class>coreservlets.ReportFilter</filter-class>
</filter>
一旦为过滤器命名,就可以通过filter-mapping元素将它与一个或多个servlet或JSP页面相关联。此时有两个选择:
第一种,可以使用filter-name和servlet-name子元素将过滤器与一个指定的servlet名(必须在同一个web.xml文件中使用servlet元素声明)相关联。
<!-- Apply the Reporter filter to the servlet named "PageName".
-->
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>SomeServletName</servlet-name>
</filter-mapping>
第二种,可以使用filter-name和url-pattern子元素与一组servlet,JSP页面或静态内容相管理。
<!-- Apply the Reporter filter to the servlet named "PageName".
-->
<filter-mapping>
<filter-name>Reporter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
参考资料
1. Servlet与JSP核心编程 卷2