FilterChain、FilterConfig 等介绍

2021-12-30 0 By admin

一、FilterChain 介绍

FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。

1.1、filter链介绍

多个Filter对同一个资源进行了拦截,那么当我们在开始的Filter中执行 chain.doFilter(request,response)时,是访问下一下Filter,直到最后一个Filter执行时,它后面没有了Filter,才会访问web资源。

如果有多个Filter形成了Filter链,那么它们的执行顺序是怎样确定的?
它们的执行顺序取决于在web.xml文件中配置的先后顺序。

二、FilterConfig介绍

在Filter中的init方法上有一个参数叫FilterConfig ,是Filter的配置对象。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,其中包含了 Filter 配置文件中的配置信息。

2.1、FilterConfig 作用

  1. 获取初始化参数
  2. 获取filter的名称
  3. 获取全局管理者(SerlvetContext对象)

2.2、FilterConfig 常用api

  1. String getFilterName();
  2. ServletContext getServletContext();
  3. String getInitParameter(String var1);
  4. Enumeration getInitParameterNames();

2.3、代码编写示例

<!--filter 标签用于配置一个Filter 过滤器-->
<filter>
    <!--给filter 起一个别名-->
      <filter-name>AdminFilter</filter-name>
    <!--配置filter 的全类名-->
      <filter-class>com.atguigu.filter.AdminFilter</filter-class>
  <init-param>
    <param-name>username</param-name>
    <param-value>root</param-value>
  </init-param>
  <init-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost3306/test</param-value>
  </init-param>
</filter>

2.4、配置文件示例

@Override
public void init(FilterConfig filterConfig) throws ServletException {
  System.out.println("2.Filter 的init(FilterConfig filterConfig)初始化");
  // 1、获取Filter 的名称filter-name 的内容
  System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
  // 2、获取在web.xml 中配置的init-param 初始化参数
  System.out.println("初始化参数username 的值是:" + filterConfig.getInitParameter("username"));
  System.out.println("初始化参数url 的值是:" + filterConfig.getInitParameter("url"));
  // 3、获取ServletContext 对象
  System.out.println(filterConfig.getServletContext());
}

三、关于 dispatcher 配置

当以什么方式去访问web资源时,进行拦截操作。
可以取的值有 REQUEST FORWARD ERROR INCLUDE:

  1. REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的,它也是默认值
  2. FORWARD 它描述的是请求转发的拦截方式配置
  3. ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
  4. INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用