• Filter--过滤器学习笔记


    一.简介

     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 设置多个映射

  • 相关阅读:
    C# String.Format格式说明
    jQuery.json.js
    禁止别人使用"另存为"保存你的网页
    组合问题的递归算法
    jQuery,contents()
    C#string,StringBuilder和Regex类的讲解
    jQuery性能优化指南
    加密算法的C#实现
    m,n组合算法
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/javamilan/p/4265837.html
Copyright © 2020-2023  润新知