服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

编写 servlet 2.3 filter (一)


  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>

扫描关注微信公众号