• Filter过滤器


    目录
    一、基本介绍
    二、Filter的生命周期
    三、FilterConfig
    四、FilterChain过滤链
    五、FilterChain注意事项和细节
    六、总结


     在此之前,你也可以了解一下我以往的文章👇👇👇

    Servlet的入门Servlet的入门
    JqueryJquery

    一、基本介绍

    1. 作用

    拦截请求,过滤响应

    2. 应用场景

    • 权限检查
    • 日志操作
    • 事务管理

    3. Filter过滤器基本原理

    在这里插入图片描述

    基本使用

    Filter接口提供了三个方法,用来处理我们的业务

    📌web.xml文件

    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <filter>
            <filter-name>myFilterfilter-name>
            <filter-class>com.jl.MyFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>myFilterfilter-name>
            <url-pattern>/test03url-pattern>
        filter-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • url-pattern配置的是拦截路径
    • url-pattern : Filter 的拦截路径, 即浏览器在请求什么位置的资源时,过滤器会进行拦截过滤
    • 精确匹配 /a.jsp 对应的 请求地址 http://ip[域名]:port/工程路径/a.jsp 会拦截
    • 目录匹配 /manage/*对应的 请求地址 http://ip[域名]:port/工程路径/manage/xx , 即 web 工程 manage 目录下所有资源都会拦截
    • 后缀名匹配 *.jsp 后缀名可变,比如 *.action *.do 等等对应
      的 请求地址 http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截
    • Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在

    📌Filter

    package com.jl;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    /**
     * @author long
     * @date 2022/9/12
     */
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("初始化完成");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("前置处理");
            doFilter(servletRequest, servletResponse, filterChain);
            System.out.println("后置处理");
        }
    
        @Override
        public void destroy() {
            System.out.println("销毁");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    二、Filter的生命周期

    Filter的生命周期分别对应Filter接口的三个方法

    1. init():当web工程启动时,会执行构造器和init方法。
    2. doFilter():当浏览器请求Tomcat的时候,如果匹配到Filter设置的url-pattern,doFilter()方法就会被调用。
    3. destroy():停止web工程的时候,销毁Filter实例,就会调用destroy()。

    三、FilterConfig

    1. FilterConfigFilter过滤器的配置类。
    2. Tomcat 每次创建 Filter 的时候,也会创建一个 FilterConfig 对象,这里包含了 Filter 配置文件的配置信息。
    3. FilterConfig对象作用是获取 filter 过滤器的配置内容。

    示例:

    📌web.xml文件

    <filter>
        <filter-name>myFilterfilter-name>
        <filter-class>com.jl.MyFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>myFilterfilter-name>
        <url-pattern>/test03url-pattern>
    filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    📌Filter

    package com.jl;
    
    
    import javax.servlet.*;
    import java.io.IOException;
    
    /**
     * @author long
     * @date 2022/9/12
     */
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        // 这里可以获取到配置信息
            String user = filterConfig.getInitParameter("user");
            String filterName = filterConfig.getFilterName();
            ServletContext servletContext = filterConfig.getServletContext();
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        }
    
        @Override
        public void destroy() {
            System.out.println("销毁");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    四、FilterChain过滤链

    1. 概念

    在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链。

    在这里插入图片描述

    2. 示例

    📌web.xml配置文件

    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>myServlet02servlet-name>
            <servlet-class>com.jl.MyServlet02servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>myServlet02servlet-name>
            <url-pattern>/test02url-pattern>
        servlet-mapping>
    
        <filter>
            <filter-name>Afilterfilter-name>
            <filter-class>com.jl.AFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>Afilterfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
        <filter>
            <filter-name>Bfilterfilter-name>
            <filter-class>com.jl.BFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>Bfilterfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    📌 AFilter 代码

    package com.jl;
    import javax.servlet.*;
    import java.io.IOException;
    /**
     * @author long
     * @date 2022/9/12
     */
    public class AFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("AFilter前置通知");
            filterChain.doFilter(servletRequest, servletResponse);
            System.out.println("AFilter后置通知");
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    📌 BFilter 代码

    package com.jl;
    import javax.servlet.*;
    import java.io.IOException;
    
    /**
     * @author long
     * @date 2022/9/12
     */
    public class BFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("BFilter前置通知");
            filterChain.doFilter(servletRequest, servletResponse);
            System.out.println("BFilter后置通知");
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    📌 MyServlet02 调用代码

    package com.jl;
    import com.sun.javafx.property.adapter.PropertyDescriptor;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextListener;
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    /**
     * @author long
     * @date 2022/9/8
     */
    public class MyServlet02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("ok");
        }
    
        @Override
        protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    👇运行结果

    AFilter前置通知
    BFilter前置通知
    ok
    BFilter后置通知
    AFilter后置通知
    
    • 1
    • 2
    • 3
    • 4
    • 5

    五、FilterChain注意事项和细节

    1. 多个 filter 和目标资源在一次 http 请求,在同一个线程中。
    2. 当一个请求 url 和 filter 的url-pattern匹配时, 才会被执行, 如果有多个匹配上,就会顺序执行,形成一个filter调用链
    3. 多个 filter 共同执行时,因为是一次 http 请求, 使用同一个 request 对象。
    4. 多个 filter 执行顺序,和 web.xml 配置顺序保持一致(匹配同一个地址)。
    5. chain.doFilter(req, resp)方法 将执行下一个过滤器的 doFilter 方法, 如果后面没有过滤器,则执行目标资源。

    💡小结:
     注意执行过滤器链时, 顺序是(用前面的案例分析) Http请求→ A 过滤器 dofilter()→A 过滤器前置代码→A 过滤chain.doFilter() →B 过滤器 dofilter() →B 过滤器前置代码→ B过滤器 chain.doFilter()→ 目标文件→B过滤器后置代码→A过滤器后置代码 →返回给浏览器页面/数据。

    六、总结

     以上就是过滤器的全部内容,只是很浅显介绍了一下过滤器的使用,目的是帮助大家快速了解过滤器的作用。如果文章有描述不正确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏

    最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
    感谢感谢~~~🙏🙏🙏

  • 相关阅读:
    价值9890元的600集Python教程,在此透露给大家!速度来拿哇
    C++新经典 | C语言
    前端开发工具有哪些?17款前端工程师必备工具推荐!
    基于SpringBoot的航班进出港管理系统
    JavaScript 49 JavaScript 作用域
    ‘‘‘python‘‘‘内置函数
    Postman的高级使用,傻瓜式学习【上】
    中学语文教学参考杂志社中学语文教学参考编辑部2022年第27期目录
    数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)
    面试20k的测试工程师什么水平?知彼知己百战不殆...
  • 原文地址:https://blog.csdn.net/qq_35947021/article/details/127833217