购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.1 过滤器Filter

过滤器顾名思义位于中间层起过滤作用,用于拦截请求或响应信息,为Java Web程序员提供一个预处理的机会,增强Java Web应用程序的灵活性。本节从过滤器的基础介绍入手,再到Filter的配置说明,最后以两个常用的过滤器应用实例综合讲解Filter的具体应用。

5.1.1 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绕过过滤器设置。

5.1.2 Filter配置说明

过滤器通过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上。

用法举例:

5.1.3 使用Filter实现编码过滤器

下面以编码过滤器为例,综合讲解一个过滤器在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 编码过滤器实例运行效果

5.1.4 使用Filter实现计时过滤器

为了加深对Filter应用的印象,在上节编码过滤器实例的基础上再增加计时过滤器功能,计时过滤器用于计算从接收请求到生成响应结果所耗费的时间。

计时过滤器PageTimerFilter(见例程5-1)在web.xml中的配置代码如下。

本实例运行效果如图5-2所示。

图5-2 计时过滤器实例运行效果

本实例的完整源代码请参考配套光盘的“源代码”部分。 YsmHpjm+ufBikG+4rATAl3qBRJz5Ri6fIta+ygBXF8HNDQEd+hTuOUVt/4Bk9WIw

点击中间区域
呼出菜单
上一章
目录
下一章
×