Snowdream

I'm awake but my world is half asleep
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

关于Filter的基本知识

Posted on 2007-05-13 17:12 ZelluX 阅读(429) 评论(0)  编辑  收藏 所属分类: OOP

1. Filter 简介
这方面的内容以前看的几本书里都找不到,想到了Sun J2EE的Tutorial,果然里面有比较详细的解释。
Filter是一个传输请求或者响应的报头和内容的对象,通常的作用是:
a) 根据不同情况处理请求。
b) 阻止请求-响应的过远传送。(Block the request-and-response pair from passing any further.)
c) 通过自定义新的请求版本,修改请求报头和数据。
d) 通过自定义新的响应版本,修改响应报头和数据。
e) 和外部资源交互。

2. Filter 编程
filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定义。
其中最重要的方法是doFilter。它可以用来:
a) 检查请求报头。
b) 自定义请求对象。
c) 自定义响应对象。
d) 调用过滤链(filter chain)中的下一个实体(entity)。如果当前过滤器已经是链中最后一个过滤器了,下一个实体就是链尾的资源;否则它就是在WAR中设置的下一个过滤器。当然也可以在此时通过不调用下一个实体来中断请求、
e) 在响应报头调用下一个过滤器后检查。
f) 抛出反应处理错误的异常。

3. 一个 Duke's Bookstore 的例子
HitCounterFilter在servlet被访问时计数。
public final class HitCounterFilter implements Filter {
  private FilterConfig filterConfig = null;

  public void init(FilterConfig filterConfig)
    throws ServletException {
    this.filterConfig = filterConfig;
  }
  public void destroy() {
    this.filterConfig = null;
  }
  public void doFilter(ServletRequest request,
    ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    if (filterConfig == null)
      return;
    StringWriter sw = new StringWriter();
    PrintWriter writer = new PrintWriter(sw);
    Counter counter = (Counter)filterConfig.
      getServletContext().
      getAttribute("hitCounter");
    writer.println();
    writer.println("===============");
    writer.println("The number of hits is: " +
      counter.incCounter());
    writer.println("===============");
    // Log the resulting string
    writer.flush();
    System.out.println(sw.getBuffer().toString());
    ...
    chain.doFilter(request, wrapper);
    ...
  }
}

4. 设置过滤器映射
部署描述符文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素:
icon 这是一个可选的元素,它声明IDE能够使用的一个图象文件。
filter-name 这是一个必需的元素,它给过滤器分配一个选定的名字。
display-name 这是一个可选的元素,它给出IDE使用的短名称。
description 这也是一个可选的元素,它给出IDE的信息,提供文本文档。
filter-class 这是一个必需的元素,它指定过滤器实现类的完全限定名。
init-param 这是一个可选的元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。

filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素::
l filter-name 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。
l url-pattern 此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式,可重复整个filter-mapping元素。
l servlet-name 此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供多个servlet-name元素项。如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素。

 


只有注册用户登录后才能发表评论。


网站导航: