日期:2014-05-16 浏览次数:20499 次
5.1.1 概念 
过滤器(filter)是能够对请求和响应的头属性(header)和能容体(body)进行操作的特殊Web构件。与一般Web构件(如servlet,JSP)不同的是,过滤器自身并不直接生成Web响应,若干个过滤器可以依次对一个Web资源的请求和响应进行作用。 
过滤器取代了早先的Servlet链接的功能。更主要的是,过滤器是Servlet2.3版本之后的标准Web构件。它的使用方法比较方便,功能也相当强。如图5-1所示,过滤器可以在Web请求到达servlet(或JSP)之前和在servlet返回响应之后对二者进行操作。过滤器和servlet之间是多对多的关系,一个过滤器可以对多个servlet的请求和响应进行过滤(如Filter A),一个servlet也可以被多个过滤器作用(如servlet3被Filter B,C,D过滤器链过滤)。 
过滤器的主要功能包括: 
* 对Web请求进行分析,对输入数据进行预处理 
* 阻止请求和响应的进行; 
* 根据功能改动请求的头信息和数据体; 
* 根据功能改动响应的头信息和数据体; 
* 和其他Web资源协作。 
* 对用户请求进行统一认证; 
* 对用户发送的数据进行过滤或替换; 
* 对用户的访问进行记录和审核; 
读者可能会提出一个问题:这些功能在servlet中都可以实现。确实。前面讲到的servlet API 能够对Web请求和响应进行各种各样的操作,而过滤器的主要意义是提供了一种更方便高效的编程结构。对于许多servlet都需要的功能,使用过滤器独立实现会简化servlet,避免功能重复。另外,Web容器提供了方便的过滤器管理机制,可以让编程人员更轻松地编写Web程序。 
可见过滤器程序的特点是通用性和可移植性。如果一个过滤器在程序中只能用在一个servlet或JSP上面而不能被其他Web程序借用,这个过滤器的存在就没有太大意义。通常的过滤器可以用在多种情况下,比如安全保护、运行记录、图像转化、数据压缩、加密解码以及XML转化等。 
5.1.2 过滤器的使用 
Servlet技术中有关过滤器的API包括javax.servlet包中的Filter,FilterChain和FilterConfig接口。 
过滤器要实现javax.servlet.Filter接口。与servlet相似,Filter接口中有init(),destroy()方法。Init方法在初始化时做准备工作,destroy方法在它被Web容器清除之前完成收尾工作,主要的过滤功能在doFilter方法中实现。 
程序5.1是javax.servlet.Filter接口的源代码: 
Java代码 
1.package javax.servlet;?? 
2.? 
3.import java.io.IOException;?? 
4.? 
5.public interface Filter {?? 
6.??? public void init(FilterConfig filterConfig) throws ServletException;?? 
7.?????? 
8.??? public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )?? 
9.??????? throws IOException, ServletException;?? 
10.? 
11.??? public void destroy();?? 
12.}? 
package javax.servlet;
import java.io.IOException;
public interface Filter {
	public void init(FilterConfig filterConfig) throws ServletException;
??? public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )
		throws IOException, ServletException;
	public void destroy();
}
程序 5.1 
5.1.3 如何使用过滤器实现职责链模式 
5.1.4 如何使用过滤器实现装饰器(decrator)设计模式 
5.1.5 用MyEclipse开发过滤器使用的例子 
登陆验证: 
Java代码 
1.package org.sky.darkness.filter ;?? 
2.? 
3.import java.io.* ;?? 
4.import javax.servlet.* ;?? 
5.import javax.servlet.http.* ;?? 
6.? 
7.public class LoginFilter implements Filter?? 
8.{?? 
9.??? public void init(FilterConfig filterConfig) throws ServletException{}?? 
10.??? public void doFilter(ServletRequest request,?? 
11.???????????????????? ServletResponse response,?? 
12.???????????????????? FilterChain chain)?? 
13.????????????? throws IOException,?? 
14.???????????????????? ServletException?? 
15.??? {?? 
16.??????? // Session属于HTTP范畴,所以ServletRequest对象需要先转换成HttpServletRequest对象?? 
17.??????? HttpServletRequest req = (HttpServletRequest)request ;?? 
18.??????? HttpSession session = req.getSession() ;?? 
19.??????? // 如果session不为空,则可以浏览其他页面?? 
20.??????? if(session.getAttribute("uname")!=null)?? 
21.??????? {?? 
22.??????????? chain.doFilter(request,response) ;?? 
23.??????? }?? 
24.??????? else? 
25.??????? {?? 
26.??????????? // 通过requestDispatcher跳转到登陆页?? 
27.??????????? request.getRequestDispatcher("login.jsp").forward(request,response) ;?? 
28.??????? }?? 
29.??? }?? 
30.??? public void destroy() {}?? 
31.};?? 
32./*?? 
33.? <filter>?? 
34.??? <filter-name>login</filter-name>?? 
35.??? <filter-class> org.sky.darkness.filter.LoginFilter</filter-class>?? 
36.? </filter>?? 
37.? <filter-mapping>?? 
38.??? <filter-name>login</filter-name>?? 
39.??? <url-pattern>/*</url-pattern>?? 
40.? </filter-mapping>? 
package org.sky.darkness.filter ;
impor