jsp过滤器

Servlet和JSP过滤器是一种用在servlet和jsp编程中的java类,其使用目的如下:

    (一)在客户访问后台资源之前拦截客户请求

    (二)在资源被送到客户端之前加以控制

 

 

规范所建议的过滤器有多种:

   (一)验证类过滤器

    (二)数据压缩类过滤器

    (三)加密过滤器

    (四)触发事件类过滤器

    (五)图片转换类过滤器

    (六)日志记录和监听过滤器

    (七)MIME-TYPE Chain类过滤器

    (八)令牌类过滤器

    (九)转换XML内容的XSL/T过滤器

 

 

 

过滤器需要部署在描述文件web.xml中,可以映射到所写应用的servlet、jsp页面或其它特定URL上。部署描述文件web.xml可以在web应用的WEB-INF目录下找到。

 

在JSP容器启动web应用时,它会自动把你在部署描述符中声明的每一个过滤器创建一个实例。过滤器执行的顺序和你在web.xml中声明的顺序一致。

 

过滤器对象中的方法

 

过滤器只是一个实现了javax.servlet.Filter接口的简单java类。接口javax.servlet.Filter定义了3个方法:

序号

方法& 描述

1

public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法在客户端请求及服务器端回复时都将被自动调用

2

public void init(FilterConfig filterConfig) 初始化配置参数,在doFilter()方法之前被调用

3

public void destroy()   结束过滤器,doFilter()方法完成后被调用

 

 

过滤器示例

 

以下示例的作用是,在客户端每次访问JSP页面时,控制台会打印出客户的ip地址和访问时间。通过此例,我们可以对过滤器有基本的理解,之后你将可以试着写出更复杂的过滤器应用。

// 导入所需java类库

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

 

// 实现Filter接口

public class LogFilter implements Filter  {

   public void  init(FilterConfig config)

                         throws ServletException{

     // 获取初始化参数

      String testParam = config.getInitParameter("test-param");

 

     //打印初化参数

      System.out.println("Test Param: " + testParam);

   }

   public void  doFilter(ServletRequest request,

                 ServletResponse response,

                 FilterChain chain)

                 throws java.io.IOException, ServletException {

 

     // 获得客户ip地址

      String ipAddress = request.getRemoteAddr();

 

     // 输出客户ip和访问时间

      System.out.println("IP "+ ipAddress + ", Time "

                                       + new Date().toString());

 

     // 将请求(或回复)传到过滤链的下一节

      chain.doFilter(request,response);

   }

   public void destroy( ){

        //在过滤器被移除服务之前由web容器调用

       System.out.println(“the log filter is destroyed…”)

   }

}

 

像编译普通java类一样编译LogFilter.java,然后将编译后的字节码文件LogFilter.class放入web应用的/WEB-INF/classes目录下。

 

 

在web.xml中配置过滤器

 

把定义好的过滤器映射到某个URL或JSP文件上,和在web.xml中配置servlet一样。在web.xml中创建如下的filter标签:

<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>

 

以上配置将应用到所有servlet和jsp,因为/*匹配所有文件。当然,你也可以将过滤器应用在某一个(些)servlet或jsp文件上。

 

现在访问任一servlet或jsp,你将会在web服务器日志中看到输出在控制台中的日志。你可以使用Log4j把日志保存在一个单独的文件中。

 

使用多个过滤器

 

对于web应用,根据不同的目的,可以定义不同的过滤器。试想,你定义了两个过滤器:AuthenFilter(验证权限)和 LogFilter(记录日志)。处理方式和上面类同,你需要像下面这样创建新的映射:

<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>

   <filter-name>AuthenFilter</filter-name>

   <filter-class>AuthenFilter</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>

 

<filter-mapping>

   <filter-name>AuthenFilter</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

 

过滤器执行顺序

 

filter-mapping元素在web.xml中的放置顺序决定了web容器应用各个过滤器的顺序。你可以颠倒filter-mapping元素次序来使过滤器反序执行。

 

例如,上面的例子会先应用LogFilter然后再应用AuthenFilter,而下面的例子执行顺序则相反:

<filter-mapping>

   <filter-name>AuthenFilter</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

 

<filter-mapping>

   <filter-name>LogFilter</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

posted @ 2012-08-28 13:26  bldream  阅读(311)  评论(0)    收藏  举报