• 文章本天成|跟我一起来一场简洁易懂的servlet的过滤器Filter的学习吧


    0、fiter是什么

    说实话,百度百科的解释干脆直接,直接引用一下。

    filter, 它使用户可以改变一个request和修改一个response.
    Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet
    chaining“(servlet 链).

    1、filter有啥用

     (1)公共代码的提取
     (2)可以处理request和response
     (3)进行权限控制
     (4)处理网站中文乱码问题
     (5)实现自动登录
     (6)过滤敏感词汇
     (7)压缩网页
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、filter在哪里

    通过这张图,我们可以看到,我们即将要学习的filter处在什么位置,清晰明了。
    在这里插入图片描述

    3、filter做了啥

    在这里插入图片描述
    通过上图,我们看到,filter做了两类事:

    1、在请求request到达servlet之前,对request进行预处理;
    2、在servlet发出响应信息response后,对响应信息response进行处理,然后返回给请求发起人。

    4、filter代码实现

    4.1 依赖包

    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-tomcat</artifactId>
         <version>2.3.1.RELEASE</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2 代码

    4.2.1 MyFirstfilter.java

    /**
     *@Description: 第一个过滤器Filter
     *@MethodName: MyFilter
     *@Author: world
     *@Date: 10/1/22 12:19 PM
     *@Version: 1.0
     **/
    
    @Component
    public class MyFirstFilter implements Filter {
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
            System.out.println("我是第一个servlet init,我是在服务启动时候被加载 1次 !");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            System.out.println("这是第一个filter----servlet处理请求之前!");
    
            Object header = servletRequest.getAttribute("Header");
    
            filterChain.doFilter(servletRequest, servletResponse);
    
            System.out.println("这是第一个filter----servlet处理请求之后!");
    
        }
    
        @Override
        public void destroy() {
    
            System.out.println("我是第一个filter----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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    4.2.2 MySecondFilter.java

    /**
     *@Description: 第二个过滤器filter
     *@MethodName: MySecondFilter
     *@Author: world
     *@Date: 10/1/22 3:34 PM
     *@Version: 1.0
     **/
    
    @Component
    public class MySecondFilter implements Filter {
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
            System.out.println("我是第二个filter----servlet init,我是在服务启动时候被加载 1次 !");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            System.out.println("这是第二个filter----servlet处理请求之前!");
    
            filterChain.doFilter(servletRequest, servletResponse);
    
            System.out.println("这是第二个filter----servlet处理请求之后!");
    
        }
    
        @Override
        public void destroy() {
    
            System.out.println("我是第二个filter----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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    4.3 配置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>MyFirstFilterfilter-name>
            <filter-class>com.world.filter.filter.MyFirstFilterfilter-class>
        filter>
        <filter>
            <filter-name>MySecondFilterfilter-name>
            <filter-class>com.world.filter.filter.MySecondFilterfilter-class>
        filter>
    
        <filter-mapping>
            <filter-name>MyFirstFilterfilter-name>
            <url-pattern>/*url-pattern>
            
        filter-mapping>
        <filter-mapping>
            <filter-name>MySecondFilterfilter-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

    5、运行结果

    5.1 服务启动,filter被加载

    在这里插入图片描述

    5.2 有请求来,filter被触发

    在这里插入图片描述

    5.3 服务关停,filter被销毁

    在这里插入图片描述

    6、篇后语

    后面会基于此把filter能够实现的各类功能,逐一编写实现,与君共勉。

  • 相关阅读:
    Hbase 协处理器
    Java开发学习(四十五)----MyBatisPlus查询语句之映射匹配兼容性
    英语学习笔记
    Android APP开机启动,安卓APP开发自启动,安卓启动后APP自动启动
    第六十章 符号概览
    Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
    一名前端工程师自检清单与思考(来吧,干完这套清单年薪30不是梦)
    【老生谈算法】matlab实现AHP算法源码——AHP算法
    JavaScript访问对象属性和方法介绍
    sqoop ETL工具
  • 原文地址:https://blog.csdn.net/QQQZSJ/article/details/127129276