编写 Servlet 2.3 Filter (一)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。

Filters 有许多的应用场合。Servlet 2.3 规范建议如下的地方可以应用Filter:

authentication filters

logging and auditing filters

image conversion filters

data compression filters

encryption filters

tokenizing filters

filters that trigger resource Access events

XSL/T filters that transform XML content

MIME-type chain filters

编写一个简单的 Filter

学习怎么样写Filter的第一步,是看一个非常简单的实例。Filter 是一个实现了 Javax.servlet.Filter 接口的类。javax.servlet.Filter 接口定义了三个方法:

public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain)

public FilterConfig getFilterConfig()

public void setFilterConfig (FilterConfig filterConfig)

创建 javax.servlet.FilterConfig 对象,并完成初始化后传递给 Filter ,是容器的职责。javax.servlet.FilterConfig 可以被用来:

提取 Filter name(在配置描述符中定义的)

提取初始化变量(在配置描述符中定义的)

得到 ServletContext 对象的引用

setFilterConfig() 方法可以被用来设置一个对象为某个 Filter 的属性。doFilter() 方法实际上真正要进行 filter 动作的地方。在这里,你可以解析用户的请求,记录统计到文件,处理返回客户端的响应,等等。列表1是一人非常简单的例子,当它 filter 客户端请求时,打印一个消息到控制台;然后当它 filter 一个返回客户端的响应时再打印一个消息到控制台。图1是一个示例这个简单的 Filter 怎样处理请求-响应模型的图表。

列表1: 一个非常简单的 Filter (SimpleFilter.java)

package com.filters;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import java.io.IOException;

import javax.servlet.ServletException;

public class SimpleFilter implements Filter

{

private FilterConfig filterConfig;

public void doFilter (ServletRequest request,

ServletResponse response,

FilterChain chain)

{

try

{

System.out.print ("Within Simple Filter ... ");

System.out.println ("Filtering the Request ...");

chain.doFilter (request, response);

System.out.print ("Within Simple Filter ... ");

System.out.println ("Filtering the Response ...");

} catch (IOException io) {

System.out.println ("IOException raised in SimpleFilter");

} catch (ServletException se) {

System.out.println ("ServletException raised in SimpleFilter");

}

}

public FilterConfig getFilterConfig()

{

return this.filterConfig;

}

public void setFilterConfig (FilterConfig filterConfig)

{

this.filterConfig = filterConfig;

}

}

以上的代码中可以看出,这个 Filter 是一个名为 SimpleFilter.java 类,它实现了 javax.servlet.Filter 接口,并提供了这个接口中三个方法的实现。

注重,doFilter 可以分为二个部分:filter request 与 filter response 。这二部分由 javax.servlet.FilterChain 对象调用 chain 中的下一个对象来隔开,这下一个对象可能是一个 Servlet 或者另外的一个 Filter 。

现在,我们写好了这样的一个简单的 Filter ,需要把它配置到一个容器中,看看运行结果。

Apache Jatarka Tomcat,4.0 以上版本都支持 Servlet 2.3 规范。本文所有的实例都在此环境下测试通过。

Filters 定义在web应用描述符中,即 web.xml 文件。Filters 先被定义,然后映射(map)到 Servlet 或者 URL ,这与 Servlet 的定义与映射是完全一样的。列表2是 web.xml 文件中,配置 SimpleFilter.java ,并映射(map)到一个 Servlet 。

Listing 2: web.xml

<?xml version = "1.0" encoding = "ISO-8859-1"?

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd";

<web-app

<!-- Define the filters within the Web Application --

<filter

<filter-name

Simple Filter Example

</filter-name

<filter-class

com.filters.SimpleFilter

</filter-class

</filter

<!-- Map the filter to a Servlet or URL --

<filter-mapping

<filter-name

Simple Filter Example

</filter-name

<url-pattern

/simple

</url-pattern

</filter-mapping

<!-- Define the Servlets within the Web Application --

<servlet

<servlet-name

Simple Servlet

</servlet-name

<servlet-class

com.servlets.SimpleServlet

</servlet-class

</servlet

<!-- Define Servlet mappings to urls --

<servlet-mapping

<servlet-name

Simple Servlet

</servlet-name

<url-pattern

/simple

</url-pattern

</servlet-mapping

</web-app

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航