一个过滤器必须要实现javax.servlet.Filter,并在web.xml里面正确地配置。过滤器可以用来对客户端对资源(servlet或静态资源如html、图片、影音等)的请求、服务端对请求资源的响应进行分别过滤,或者同时过滤。
Filter接口定义了三个方法:
doFilter(ServletRequest request, ServletResponse response, FilterChain chain):处理过滤信息;
init(FilterConfig filterConfig):初始化filter。在web容器加载filter时执行。
destroy():销毁占用资源。在web容器销毁filter时执行。
以下情形是Filter的应用示例:
1、权限
2、日志及核查
3、图像转换
4、数据压缩
5、加密
6、语义解析
7、触发资源访问事件
8、XSL/T应用
9、 数据类型解析(Mime-type chain Filter)
下面举例说明Filter在语义解析方面的应用。在这个示例中,给出了一种伪静态化的实现方法。这里的伪静态化的含义就是,在客户端表现为静态化的页面链接,但服务端并没有对应的静态html页面,仍然是动态地从数据库读取数据。这需要在Filter里面对静态html资源的请求转化为对servlet或jsp的动态调用。
假设我们做一个小说网站。小说的内容通过后台编辑来发布。一篇小说包括基本信息和章节信息来组成,它们之间是一对多的关系。小说的基本信息用小说名称来唯一标识,章节名称用数字1、2、3等来标识,我们通过传入小说名称和章节号到viewBook.jsp来显示小说的章节内容,在访问地址会是这样的格式: http://127.0.0.1/books/viewBook.jsp?name=guichuideng&article=1
但这种格式对应客户端来说是没有意义的,你可能需要提供一个更友好的访问地址如:
http://127.0.0.1/books/guichuiden/1.html
我们通过BookFilter来实现伪静态化的过程。
在web.xml里面配置:
<filter> <filter-name>BookFilter</filter-name> <filter-class>com.hx.servlet.BookFilter</filter-class> <init-param> <param-name>BOOK_URI</param-name> <param-value>books/</param-value> </init-param> <init-param> <param-name>BOOK_SERVLET</param-name> <param-value>/books/viewBook.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>BookFilter</filter-name> <url-pattern>/books/*</url-pattern> </filter-mapping>
Java代码:
package com.hx.servlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BookFilter implements Filter {
/** 小说放置目录 */
private static String bookURI = "";
/** 小说查看Servlet */
private static String bookServlet = "";
public void init(FilterConfig filterConfig) throws ServletException {
bookURI = filterConfig.getInitParameter("BOOK_URI");
bookServlet = filterConfig.getInitParameter("BOOK_SERVLET");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String contextPath = request.getContextPath();
String uri = request.getRequestURI();
String resource = uri.substring(contextPath.length() + 1, uri.length());
resource = resource.substring(bookURI.length());
String[] tmp = resource.split("/");
if (tmp.length != 2 || tmp[1].indexOf(".htm") <= 0) {
filterChain.doFilter(servletRequest, servletResponse);
}
else {
String bookName = tmp[0];
String article = tmp[1].substring(0, tmp[1].indexOf(".htm"));
request.setAttribute("name", bookName);
request.setAttribute("article", article);
//分发请求
//bookServlet里面根据request.getAttribute("name")和request.getAttribute("article")
//分别获取小说名和章节编号
request.getRequestDispatcher(bookServlet).forward(request, response);
}
}
public void destroy() {
}
}