• 【JavaWeb】过滤器和监听器,就这?


    1 Filter

    1.1 Filter简介

    • Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。

    • 过滤器可以把资源的请求拦截下来,从而实现一些特殊的功能。

    • 过滤器一般完成一些通用的操作,比如权限控制、统一编码处理、敏感字符处理等等

    • Filter流程图

    image-20220916165132403

    1.2 Filter的快速入门

    Filter和Servlet很相像,步骤也是一样的。

    1.2.1 创建Filter类

    1. 新建一个Filter.java文件,实现Filter接口
    2. 实现接口后,重写其三个方法
    3. 其中都chain.doFilter()是放行的方法
    4. inti、和destory都是生命周期的函数
    5. @WebFilter()配置的是拦截的路径,当访问这个路径的时候,Filter会被调用

    注意:此处导入的Filter 是Javax Servlet包下的

    @WebFilter("/index.jsp")
    public class DemoFilter01 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("1.init.......");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("2.放行前.....");
            chain.doFilter(request,response);
            System.out.println("4.放行后.....");
        }
    
        @Override
        public void destroy() {
            System.out.println("5.destory....");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.2.2 访问index.jsp

    由上图分析所致,当我们访问index.jsp的时候,会调用Filter,那么我们用代码检验一下上面的流程图。

    **按照流程图,正确的输出应该是1、2、3、4、5,**访问一下index.jsp

    
    
    

    Hello World!

    <% System.out.println("3. 我是index.jsp ......"); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果证明流程图是正确的!

    image-20220916170059877

    image-20220916170239334

    1、放行后访问对应资源,资源访问完成后,还会回到Filter吗?

    2、如果回到Filter中,是重头执行还是执行放行后的逻辑呢?

    放行后的逻辑

    1.3 Filter的拦截路径的配置

    配置在**@WebFilter(“”)**中,主要有以下四类

    • 拦截具体的资源路径:/index.jsp,只有访问index.jsp的时候才会被拦截
    • 目录拦截:/user/*,访问/user下的所有资源,都会被拦截
    • 后缀名拦截:*.jsp 访问后缀名为jsp的资源,都会被拦截
    • 拦截所有:/* 访问所有的资源,都会被拦截

    1.4 过滤器链

    1.4.1 过滤器链简介

    一个web路径,可以配置多个过滤器,这多个过滤器就被称为过滤器链。

    流程图如下:

    image-20220916170723375

    见图知意:

    当web应用有一个A一个B过滤器组成的过滤器链时,A放行后,会来到B过滤器。只有两个过滤器都放行,才会访问到相应的资源。随后,按照怎么来的,怎么返回的方式,执行B、A的放行后逻辑

    注意:

    为什么是按照A、B,而不是B、A呢?

    你以为我瞎说的?其实不然,**排序方式即为按照字符串排序,**先后执行。就是字符串排序小的限制性。

    1.4.2 过滤器链的例子

    由上面的流程图可知,浏览器会按照DemoFilter01 DemoFilter02 的方式 访问过滤器链,所以我们配置了两个过滤器类。

    @WebFilter("/index.jsp")
    public class DemoFilter01 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("DemoFilter01 init.......");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("1.DemoFilter01 doFilter.....");
            chain.doFilter(request,response);
            System.out.println("5.DemoFilter01 doFilter end.....");
        }
    
        @Override
        public void destroy() {
            System.out.println("DemoFilter01 destory....");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    @WebFilter("/index.jsp")
    public class DemoFilter02 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("DemoFilter02 init......");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("2.DemoFilter02 doFilter....");
            chain.doFilter(request,response);
            System.out.println("4.DemoFilter02 doFilter end....");
        }
    
        @Override
        public void destroy() {
            System.out.println("DemoFilter02 destory.....");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    
    
    

    Hello World!

    <% System.out.println("3. index.jsp ......"); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    效果图如下:

    image-20220916171847930

    2 Listener

    2.1 概念

    • Listener表示监听器,是JavaWeb三大组件之一。

    • 监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

    • Listener分类:Javaweb提供了8个监听器(接口)

    image-20220916172726246

    2.2 监听器的使用

    @WebListener
    public class DemoListener01 implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("contextInitialized....");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("contextDestroyed....");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    当启动Tomcat的时候,会自动调用!

    ntln(“contextInitialized…”);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed....");
    }
    
    • 1
    • 2
    • 3
    • 4

    }

    
    当启动Tomcat的时候,会自动调用!
    
    ![image-20220916172910166](https://img-blog.csdnimg.cn/img_convert/7d4ee33099f9d23fddadcfc5140ab6f4.png)
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【干货】【常用电子元器件介绍】【二极管】(一)--二极管的种类、识别、检测和主要参数
    【11.1】【VP】Codeforces Round #730 (Div. 2)
    基于miniprogram-ci的微信小程序的CI以及接入钉钉通知
    如何使用HTML制作个人网站( web期末大作业)
    每日一题:Spring 框架中都用到了哪些设计模式❓
    JVM基础-Hotspot VM相关知识学习
    阿里二面凉了,难蹦。。。
    2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计
    625和730 PMP考试复盘,从考试知识分布到备考建议,了解考试难度
    vue搭建项目、创建登录页面和后台交互之引入axios
  • 原文地址:https://blog.csdn.net/m0_59792745/article/details/126895040