Servlet(四) 过滤器

Servlet Filter是存在于Servlet程序中的一批类,用于以下目的:

  • 在客户端请求访问后台资源之前对其进行拦截,并做指定处理
  • 在结果反馈给客户端之前对其进行指定的处理

目前存在各类过滤器,如下所示:

  • 鉴权过滤器
  • 数据解/压缩过滤器
  • 数据加/解密过滤器
  • 触发资源访问事件的过滤器
  • 图像转换过滤器
  • 日志及审计过滤器
  • MIME-TYPE链过滤器
  • 令牌过滤器
  • XML内容转换过滤器

过滤器通过web.xml进行发布,使用Servlet名字或URL模式进行映射。当Web容器启动时,它会为web.xml定义的每一个过滤器创建相应的实例,然后会依据web.xml过滤器的定义顺序依次调用,确切的讲,是依据<filter-mapping>的定义顺序。

 

过滤器的方法:

过滤器是实现了javax.servlet.Filter接口的类,该接口定义了三个方法:

  • public void doFilter (ServletRequest, ServletResponse, FilterChain)

    每当有 请求/应答对经过过滤器链的前后末端时,web容器都会调用该方法,由于链中的过滤器是依据web.xml中定义的顺序进行排序的,所以请求会依次经过被12345过滤器进行处理,应答是依次被54321过滤器进行处理

  • public void init(FilterConfig filterConfig)

    该方法被web容器调用,以标示当前过滤器已准备好提供相应的服务

  • public void destroy()

    该方法被web容器调用,以标示当前过滤器已不再提供相应的服务

 

代码示例:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) 
                         throws ServletException{
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 

      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, 
                 ServletResponse response,
                 FilterChain chain) 
                 throws java.io.IOException, ServletException {

      // Get the IP address of client machine.   
      String ipAddress = request.getRemoteAddr();

      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time "
                                       + new Date().toString());

      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   public void destroy( ){
      /* Called before the Filter instance is removed 
      from service by the web container*/
   }
}

上面的代码是一个日志过滤器类,实现了Filter接口,将其编译之后,通常放到web-inf下的classes目录下,然后修改web.xml将其发布:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

上面仅仅为一个过滤器,如果还有其它需要,当然还可以所上所示再添加其它功能的过滤器。

 

/***********************************************外星人乔丹拍板时间***********************************************/

既然是容器,那web容器会包容程序员编写的各类主要功能的代码,然后由容器负责调用,减轻程序员的编码工作量,降低代码的耦合度,过滤器就是一个

经典的例子,只需在web.xml中进行相应过滤链的配置,其它的事情,交给容器去处理

posted @ 2014-07-24 09:41  欧文-6-6-6  阅读(250)  评论(0编辑  收藏  举报