zoukankan      html  css  js  c++  java
  • JavaWeb 之 Filter:过滤器

    一、Filter 概述

      1、概念

        Filter 过滤器是 JavaWeb 的三大组件之一。(Servlet、Filter、Listener)

        Filter 过滤器它是 JavaEE 的规范,可以在浏览器以及目标资源之间起到一个过滤的作用,它的作用是:拦截请求,过滤响应。

        web 中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

      2、作用

        拦截请求常见的应用场景有:

          ① 登录验证;

          ② 权限检查;

          ③ 事务管理;

          ④ 统一编码处理;

          ⑤ 敏感字符等等

    二、使用步骤

      1、定义一个类,实现接口 Filter

      2、实现 doFilter() 方法 

      3、配置拦截路径

        ① web.xml 配置

          格式:

     1 <!--filter 标签用于配置一个 Filter 过滤器-->
     2 <filter>
     3     <!--给 filter 起一个别名-->
     4     <filter-name>AdminFilter</filter-name>
     5     <!--配置 filter 的全类名-->
     6     <filter-class>com.atguigu.filter.AdminFilter</filter-class>
     7 </filter>
     8 <!--filter-mapping 配置 Filter 过滤器的拦截路径-->
     9 <filter-mapping>
    10     <!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
    11     <filter-name>AdminFilter</filter-name>
    12     <!--  url-pattern 配置拦截路径,可以有多个拦截路径
    13     / 表示请求地址为: http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
    14     /admin/* 表示请求地址为: http://ip:port/工程路径/admin/*
    15     -->
    16     <url-pattern>/admin/*</url-pattern>
    17     <url-pattern>/client/*</url-pattern>
    18 </filter-mapping>

        ② 注解方式配置

           在类上添加 @WebFilter() 即可,里面填写访问所要拦截的资源的路径。

      4、代码实现

     1 import javax.servlet.*;
     2 import javax.servlet.annotation.WebFilter;
     3 import java.io.IOException;
     4 
     5 @WebFilter("/*")
     6 public class FirstFilter implements Filter {
     7     public void destroy() {
     8     }
     9     // doFilter 方法,专门用于拦截请求,过滤响应
    10     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    11         System.out.println("filterDemo1被执行了....");
    12         // 放行操作
    13         chain.doFilter(req, resp);
    14     }
    15 
    16     public void init(FilterConfig config) throws ServletException {
    17 
    18     }
    19 
    20 }

       5、Filter 的工作流程图

        

    三、Filter 的生命周期

      Filter 的生命周期包含几个方法:

      1、构造器方法

          执行时机:在 web 工程启动的时候执行(Filter 会创建)

      2、init 初始化方法

          执行时机:在 web 工程启动的时候,构造方法执行完,立刻执行 init 方法,做一些初始化的操作

      3、doFilter 方法

          执行时机:每次访问目标资源时都会调用,每次拦截到请求,就会执行(执行多次);

      4、destroy 方法

          执行时机:停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器),用来释放资源

    四、Filter 接口

       Filter 是一个接口,给我们提供了下面三个方法

       

        Filter 接口,实现 Filter 需要实现该接口。

        (1)init() 方法用于初始化 Filter;

        (2)doFilter() 是过滤请求和响应的主要方法;

        (3)destory() 用于在 Filter 对象被销毁前做收尾工作,如是否资源等;

    五、FilterConfig 类

      FilterConfig 类是 Filter 过滤器的配置文件类。

      

      Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里面包含了 Filter 配置文件的配置信息。

      FilterConfig 对象在服务器调用 init() 方法时传递进行。

      FilterConfig 类的作用是获取 filter 过滤器的配置内容:

    getFilterName():获取 Filter 的名称 filter-name 的内容;

    getSerletContext():获取ServletContext 对象(即 application)

    getInitParameter():获取在 Filter 中配置的 init-param 初始化参数;

    getInitParameterNames():获取所有初始化参数的名字;

       Demo:

     1 web.xml 的配置:
     2  <!--filter 标签用于配置一个 Filter 过滤器-->
     3     <filter>
     4         <!--给 filter 起一个别名-->
     5         <filter-name>AdminFilter</filter-name>
     6         <!--配置 filter 的全类名--><filter-class>com.atguigu.filter.AdminFilter</filter-class>
     7         <init-param>
     8             <param-name>username</param-name>
     9             <param-value>root</param-value>
    10         </init-param>
    11         <init-param>
    12             <param-name>url</param-name>
    13             <param-value>jdbc:mysql://localhost3306/test</param-value>
    14         </init-param>
    15     </filter>
    16 
    17 Filter 代码:
    18     public void init(FilterConfig filterConfig) throws ServletException {
    19         
    20         // 1、 获取 Filter 的名称 filter-name 的内容
    21         System.out.println("filter-name 的值是: " + filterConfig.getFilterName());
    22         
    23         // 2、 获取在 web.xml 中配置的 init-param 初始化参数
    24         System.out.println("初始化参数 username 的值是: " + filterConfig.getInitParameter("username"));
    25         System.out.println("初始化参数 url 的值是: " + filterConfig.getInitParameter("url"));
    26         
    27         // 3、 获取 ServletContext 对象
    28         System.out.println(filterConfig.getServletContext());
    29     }

    六、FilterChain 过滤器链

        FilterChain 对象是在 doFilter() 方法被调用时作为参数传递进来的。

        

         doFilter() 方法用于调用 Filter 链上的下一个过滤器,如果当前过滤器为最后一个,过滤器则将请求发送到目标资源。

        FilterChain 过滤器链(多个过滤器如何一起工作)  

      (1)执行顺序:如果有两个过滤器:过滤器1和过滤器2

               ① 过滤器1前置代码

           ② 过滤器2前置代码

           ③ 资源执行 doFilter()

           ④ 过滤器2 后置代码

           ⑤ 过滤器1 后置代码

      (2)过滤器先后顺序问题

           ① 注解配置:

            规则:按照类名的字符串比较规则比较,值小的先执行。

            如: AFilter 和 BFilter,AFilter就先执行了。

           ② web.xml 配置:

            规则: 按照 <filter-mapping> 的顺序决定的,如果定义的位置越靠前,越先被调用;

      (3)多个 Filter 过滤器执行的特点

          ① 所有 Filter 和目标资源默认都执行在同一个线程中;

          ② 多个 Filter 共同执行的时候,它们都是使用同一个 Request 对象;

      执行流程图:

      

    七、Filter 的拦截路径(目标资源)

      目标资源指的是需要调用 Filter 来进行过滤处理的资源。主要有以下几种配置方式:

      1、精确匹配

        通过 <filter-mapping> 下的 url-pattern 来配置

        格式

    <url-pattern>/target.jsp</url-pattern>
    

               以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

        精确匹配只要在请求地址完全一样时才会调用 Filter 

      2、目录匹配

        路径匹配只要是所请求的资源在设置的路径下就会调用 Filter 

        格式:

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

         以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

      3、后缀名匹配

        后缀匹配只要访问的资源路径是以指定后缀结尾就会调用 Filter 

          格式:

    <url-pattern>*.html</url-pattern>
    以上配置的路径, 表示请求地址必须以.html 结尾才会拦截到
    <url-pattern>*.do</url-pattern>
    以上配置的路径, 表示请求地址必须以.do 结尾才会拦截到
    <url-pattern>*.action</url-pattern>
    以上配置的路径, 表示请求地址必须以.action 结尾才会拦截到
    

      

        注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!

      4、使用 servlet-name 配置

        通过 filter-mapping 中的 servlet-name 来指定过滤的 Servlet

        在 Filter 的 filter-mapping 中增加了一个 servlet-name 标签,这个标签的值是其中某一个 servlet 的名字,在访问 Servlet 时就会调用该过滤器请求。

        如图:

        

    八、过滤器细节

      2、过滤器的执行流程?

        (1)执行过滤器

        (2)执行要放行的资源

        (3)回来执行过滤器放行代码下面的代码

      3、过滤器的生命周期方法?

        (1)init 方法:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,一般用于加载资源。

        (2)doFilter 方法:每一次请求被拦截资源时,会执行。执行多次

        (3)destory 方法:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次,一般用于释放资源。

      4、过滤器配置详解?

        (1)拦截路径配置

           1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行

           2. 拦截目录:        /admin/*     访问/user下的所有资源时,过滤器都会被执行

           3. 后缀名拦截:    *.jsp            访问所有后缀名为jsp资源时,过滤器都会被执行

           4. 拦截所有资源: /*                访问所有资源时,过滤器都会被执行

        (2)拦截方式配置:资源被访问的方式

              在 filter-mapping 还有一个子标签 dispatcher,该标签用来指定需要 Filter 处理的请求类型,该标签可以配置四个值

            配置

              设置 dispatcherTypes 属性

              

    属性名 解释
    REQUEST 默认值。浏览器直接请求资源
    FORWARD 转发访问资源时调用 Filter
    INCLUDE 动态包含访问资源时调用Filter
    ERROR 错误跳转资源
    ASYNC 异步访问资源

           web.xml 配置

               设置 <dispatcher></dispatcher>标签,在里面填入上面的值即可。

            以上四种情况可以设置一个,也可以同时设置多个,如果不设置默认是 Request。

     

       

  • 相关阅读:
    ES5 创建构造函数的私有属性
    js 触发打印操作
    创建 React 项目
    处理因使用 BigInt 等最新语法时 ts 编译报错
    TS 查找第三方声明文件
    Git 撤销工作区中的变动
    Git 查看文件修改状态
    Git 查看用户名和 Email
    查看某个 npm 包的所有发行版版本号,比如 vue
    Git 查看文件修改详情
  • 原文地址:https://www.cnblogs.com/niujifei/p/11627551.html
Copyright © 2011-2022 走看看