一.简介

 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,即对servlet的请求和响应进行拦截

在 Servlet API 中定义了三个接口类来开供开发人员编写Filter 程序:Filter, FilterChain, FilterConfig;

Filter 程序是一个实现了 Filter 接口的 Java 类,由 Servlet 容器进行调用和执行;

Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源;

若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个

Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致

 

二.Filter相关API

1.Filter接口

   Filter生命周期与Servlet很类似

①在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存

②装载并创建Filter的一个实例对象:调用Filter实例对象的init(FilterConfig filterConfig)方法,该方法在 Filter 生命周期中仅执行一次

当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter(ServletRequest request,ServletResponse response,

  FilterChain chain)方法;在特定的操作完成后,可以调用chain.doFilter(request,response)方法,把请求交给下个Filter或Servlet处理,或直接

  将请求转发或重定向

④WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Filter,并在卸载之前调用Filter的destroy()方法,该方法在Filter的生命周期中仅执行一次

 

2.FilterConfig 接口

   类似于ServletConfig接口,由容器实现

   ServletConfig对象中封装了ServletContext 对象和 Filter 的配置参数信息,并将其作为参数传入Filter对象的init()方法中

 

3.FilterChain接口

   代表当前 Filter 链的对象,由容器实现,并将其实例作为参数传入过滤器对象的doFilter()方法中

   在doFilter()方法,通过chain.doFilter(request,response),使过滤器链中的下一个过滤器被调用。若为最后一个过滤器,则调用目标资源

 

三.Filter的注册与设置

  定义完Filter类后,需要在web.xml中注册和映射Filter如下:

  <!-- Filter注册 -->
  <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>com.milan.filter.TestFilter</filter-class>
  </filter>
  
  <!-- Filter映射 -->
  <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
  </filter-mapping

 

1.Filter注册

  在注册Filter时,可以用<init-param>标签为过滤器指定初始化参数,在过滤器中,可以使用FilterConfig接口对象来访问初始化参数

 

2.Filter映射

 

  Filter映射:用<filter-mapping>设置一个 Filter 所负责拦截的资源,其拦截的资源有两种:资源访问的请求路径(<url-pattern>)和

                 Servlet 名称(<servlet-name>)

 <filter-mapping>还有一个<dispatcher>标签,用于指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST(默认),

 INCLUDE,FORWARD和ERROR之一,并且可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截,如下:

 <!-- Filter映射 -->
  <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher><!-- 表示当用户直接访问index.jsp时拦截 -->
    <dispatcher>FORWARD</dispatcher><!-- 表示当用户请求被转发index.jsp时拦截 -->
  </filter-mapping>

 

  设置了<dispatcher> ,表示拦截器只拦截以指定方式访问资源的请求与响应

    REQUEST:用户直接访问页面

    INCLUDE:目标资源是通过RequestDispatcher的include()方法访问

    FORWARD:目标资源是通过RequestDispatcher的forward()方法访问

    ERROR:目标资源是通过声明式异常处理机制调用时

    注意:这里的ERROR的声明式异常,指的是在web.xml中用<error-page>标签指定的错误页面

          而在jsp页面用<%@ page errorPage="errror.jsp" %>,其实质还是转发,要用FORWARD过滤

 

在同一个 web.xml 文件中可以为同一个 Filter 设置多个映射

 

posted on 2015-02-01 17:45  milan's  阅读(757)  评论(0编辑  收藏  举报