日期:2014-05-16 浏览次数:20411 次
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