过滤器顾名思义位于中间层起过滤作用,用于拦截请求或响应信息,为Java Web程序员提供一个预处理的机会,增强Java Web应用程序的灵活性。本节从过滤器的基础介绍入手,再到Filter的配置说明,最后以两个常用的过滤器应用实例综合讲解Filter的具体应用。
Filter(过滤器)技术是Servlet 2.3 新增加的功能。过滤器并不是Servlet,而是位于请求与响应中间的实现过滤功能的程序。在服务器上它先于与之相关的Servlet或JSP页面运行。
过滤器能够拦截请求或响应信息,并对其进行过滤处理。正由于它的这一特性,通常用它来实现一些特殊的功能,比如资源请求及响应报告、日志记录、访问权限控制、编码转换、数据加密等。
一个过滤器可以附加到一个或多个Servlet上,一个Servlet可以附加一个或多个过滤器。一个filter必须实现javax.servlet.Filter接口并定义3个方法。
· init() :这个方法在容器实例化过滤器时被调用,它主要用于使过滤器为处理做准备。容器为这个方法传递一个FilterConfig对象,其中包含配置信息。
· doFilter() :这个方法用于处理请求和响应。它接受3个输入参数:ServletRequest、ServletResponse和FilterChain 对象。FilterChain对于正确的过滤操作至关重要。doFilter() 方法必须调用FilterChain的doFilter()方法,除非该方法用来拦截以后的下游处理。
· destroy() :该方法由容器在销毁过滤器实例之前调用。
例如,可创建一个过滤器PageTimerFilter(见例程5-1)用于计算从接收请求到生成响应结果所耗费的时间。
例程5-1 PageTimerFilter.java
在Java Web应用中创建过滤器一般步骤如下。
(1)建立一个实现Filter接口的类并定义3个方法:doFilter、init和destroy。
(2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象,此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问;第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数;最后一个参数为FilterChain,如下一步所述,此参数用来调用Servlet或JSP页。
(3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与Servlet或JSP页面关联,则Servlet或JSP页面被激活。
(4)对相应的Servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
(5)禁用激活器Servlet。防止用户利用默认Servlet URL绕过过滤器设置。
过滤器通过web.xml文件中的两个XML标签<filter>和<filter-mapping>来声明。
·<filter>标签负责把一个过滤器名和一个特定的类关联起来,这种关联通过<filter-name>和<filter-class>元素指定。使用<inti-param>和成对的<param-name>和<param-value>为过滤器指定初始化参数。
·<filter-mapping>必须有一个<ulr-pattern>或者<servlet-name>元素。可通过<ulr-pattern>来指定通配符,将过滤器应用到Web资源范围,也可以通过<servlet-name>将过滤器指定到某一个特定的Servlet上。
用法举例:
下面以编码过滤器为例,综合讲解一个过滤器在Java Web程序中的具体应用。
首先编制一个编码过滤器类EncodingFilter.java(见例程5-2),然后将编码过滤器EncodingFilter在web.xml(见例程5-3)中进行配置,再创建一个发起请求的HTML测试页面index.htm(见例程5-4),最后再创建一个用于处理请求的JSP页面process.jsp(见例程5-5)。
例程5-2 编码过滤器EncodingFilter.java
例程5-3 编码过滤器在web.xml中的配置
例程5-4 发起请求的HTML测试页面index.htm
例程5-5 处理请求的JSP页面process.jsp
通过编码过滤器以后,处理请求的JSP可直接获取正常的中文参数值,无须进行编码的硬性转换,彻底解决了Java Web应用的中文编码问题。
本实例运行效果如图5-1所示。
图5-1 编码过滤器实例运行效果
为了加深对Filter应用的印象,在上节编码过滤器实例的基础上再增加计时过滤器功能,计时过滤器用于计算从接收请求到生成响应结果所耗费的时间。
计时过滤器PageTimerFilter(见例程5-1)在web.xml中的配置代码如下。
本实例运行效果如图5-2所示。
图5-2 计时过滤器实例运行效果
本实例的完整源代码请参考配套光盘的“源代码”部分。