JavaWeb核心篇(5)——Filter和Listener

2022-10-25 18:20:56 浏览数 (2)

JavaWeb核心篇(5)——Filter和Listener

JavaWeb具有三大组件:Servlet,Filter,Listener

在之前的文章中,我们已经学习了Servlet,这篇文章我们来介绍Filter和Listener来补全这部分知识点

Filter

首先Filter的汉语意义为:过滤器

过滤器可以把对资源的请求拦截下来,并做出相应判断并考虑是否放行

过滤器通常用来实现一些特殊的功能,比如:权限控制,统一编码处理,敏感字符处理等

Filter执行流程

如上图是使用过滤器的流程,我们通过以下问题来研究过滤器的执行流程:

  • 放行后访问对应资源,资源访问完成后,还会回到Filter中吗? 从上图就可以看出肯定 会回到Filter中
  • 如果回到Filter中,是重头执行还是执行放行后的逻辑呢? 如果是重头执行的话,就意味着 放行前逻辑 会被执行两次,肯定不会这样设计了; 所以访问完资源后,会回到 放行后逻辑,执行该部分代码。

通过上述的说明,我们就可以总结Filter的执行流程如下:

其中执行放行前逻辑是针对request进行;而执行放行后逻辑是针对response进行的

Filter快速入门

进行 Filter 开发分成以下三步实现:

  • 定义类,实现 Filter接口,并重写其所有方法
  • 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源
  • 在doFilter方法中输出一句话,并放行

上述代码中的 chain.doFilter(request,response); 就是放行,也就是让其访问本该访问的资源。

Filter拦截路径配置

Filter和Serlvet一样,我们采用注解的格式来标记使用地址

那么我们就可以根据使用要求来设置不同的Filter使用场景,配置不同的拦截资源

拦截路径主要分为四种:

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

Filter过滤器链

一个Web应用中,可以配置多个过滤器,这多个过滤器被称为过滤器链

其中的顺序为:

  1. 执行 Filter1 的放行前逻辑代码
  2. 执行 Filter1 的放行代码
  3. 执行 Filter2 的放行前逻辑代码
  4. 执行 Filter2 的放行代码
  5. 访问到资源
  6. 执行 Filter2 的放行后逻辑代码
  7. 执行 Filter1 的放行后逻辑代码

以上流程串起来就像一条链子,故称之为过滤器链。

注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序来比较

Listener

Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

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

request 和 session 我们学习过。

applicationServletContext 类型的对象。

ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

Listener分类

JavaWeb 提供了8个监听器:

这里面只有 ServletContextListener 这个监听器后期我们会接触到,ServletContextListener 是用来监听 ServletContext 对象的创建和销毁。

ServletContextListener 接口中有以下两个方法

  • void contextInitialized(ServletContextEvent sce)ServletContext 对象被创建了会自动执行的方法
  • void contextDestroyed(ServletContextEvent sce)ServletContext 对象被销毁时会自动执行的方法

代码展示

我们只演示一下 ServletContextListener 监听器

  • 定义一个类,实现ServletContextListener 接口
  • 重写所有的抽象方法
  • 使用 @WebListener 进行配置

代码如下:

代码语言:javascript复制
@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //加载资源
        System.out.println("ContextLoaderListener...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //释放资源
    }
}

启动服务器,就可以在启动的日志信息中看到 contextInitialized() 方法输出的内容,同时也说明了 ServletContext 对象在服务器启动的时候被创建了。

结束语

好的,关于Filter和Listener我们就介绍到这里

附录

该文章属于学习内容,具体参考B站黑马程序员陈老师的JavaWeb课程

这里附上链接:01-Filter-概述&快速入门&执行流程_哔哩哔哩_bilibili

0 人点赞