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

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

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

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

Filter

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

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

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

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

Filter执行流程

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

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

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

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

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

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

Filter快速入门

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

  • 定义类,实现 Filter接口,并重写其所有方法

JavaWeb核心篇(5)——Filter和Listener
  • 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源

JavaWeb核心篇(5)——Filter和Listener
  • 在doFilter方法中输出一句话,并放行

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

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

Filter拦截路径配置

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

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

拦截路径主要分为四种:

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

Filter过滤器链

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

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

其中的顺序为:

  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个监听器:

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

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

ServletContextListener 接口中有以下两个方法

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

代码展示

我们只演示一下 ServletContextListener 监听器

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

代码如下:

@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

Original: https://www.cnblogs.com/qiuluoyuweiliang/p/16687999.html
Author: 秋落雨微凉
Title: JavaWeb核心篇(5)——Filter和Listener

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611533/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 第05章 MySQL排序与分页

    第05章 MySQL排序与分页 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend):降序 *ORDER …

    数据库 2023年5月24日
    0113
  • windows安装mysql8.0.29(ZIP解压安装版本)

    一. 下载mysql 8.0.29软件包 二. 解压,初始化安装 1,打开下载后文件所在目录,使用解压软件解压,打开文件夹!(如图,文件路径不要出现中文!) 2,创建my.ini文…

    数据库 2023年5月24日
    0109
  • [springmvc]从前端获取参数以及显示

    6.接收请求参数以及数据回显 接收普通参数 参数名与前端传递的参数名相同时 前端表单名name=name $Title$ username: 后端收到的参数名String name…

    数据库 2023年6月16日
    0128
  • mysql主从

    mysql主从 mysql主从 1.主从原理 1.1 主从介绍 1.2 主从作用 1.3 主从形式 1.4 主从复制原理 2.主从复制配置 2.1 mysql安装 2.2 mysq…

    数据库 2023年5月24日
    0107
  • Geoserver对发布的数据源进行金字塔切片

    一、建立切片数据源1.1建立工作区 1.2添加数据我这里是老师给的高清卫星地图数据,格式为tif工作区选择之前建立的工作区,浏览那里选择对应的文件 1.3建立切片源的图层这里建立的…

    数据库 2023年6月6日
    0125
  • Mybatis的级联查询,分步查询,一对一,一对多和多对一

    配置和代码目录 ***util配置 ***log4j配置 –可以打印入日志,也可以使用系统自带的STDOUT_LOGGING个人喜欢log4j ***mybatis-c…

    数据库 2023年6月16日
    0111
  • MySQL变量、流程控制和游标

    变量、流程控制和游标 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果的数据 系统变量 变量由系统定义,属于服务器级别 […

    数据库 2023年5月24日
    096
  • FastDFS分布式文件系统简介

    1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高…

    数据库 2023年6月14日
    0127
  • 0811JDBC随笔

    1.JDBC体系系统 一组规范:接口 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)…

    数据库 2023年5月24日
    0106
  • SkyWalking Agent端日志插件的编写历程与使用说明

    前一段时间顺利完成了SkyWalking Agent端logger-plugin插件的开发,在此做个总结。一方面给插件的使用方法写一中文说明,另一方面分享一下该插件开发过程中的一些…

    数据库 2023年6月11日
    0103
  • 5个必知的高级SQL函数

    5个必知的高级SQL函数 SQL是关系数据库管理的标准语言,用于与数据库通信。它广泛用于存储、检索和操作数据库中存储的数据。SQL不区分大小写。用户可以访问存储在关系数据库管理系统…

    数据库 2023年6月11日
    0126
  • 记一次vcenter连接esxi失败问题排查(443端口不通)

    vecenter错误 esxi宿主机重启后,vcenter连接esxi提示超时,使用vmware客户端连接esxi也提示超时,开始介入排查。 故障排查 如何进入命令终端 运行alt…

    数据库 2023年6月9日
    0139
  • 事务的四大特性

    事务的四大特性 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状…

    数据库 2023年6月11日
    0118
  • 数据结构入门之单链表代码实现(java)

    1:单链表是: 单链表是一种链式存取的 数据结构 用一组地址任意的 存储单元 存放线性表中的数据元素。 链表中的数据是以结点来表示的,每个结点的构成:元素 ( 数据元素 的映象) …

    数据库 2023年6月6日
    0139
  • Java中的锁——锁的分类

    Java中有各种各样的锁,例如公平锁、乐观锁等等,这篇文章主要介绍一下各种锁的分类。 *公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的…

    数据库 2023年6月9日
    0112
  • 三分钟入门 InnoDB 存储引擎中的表锁和行锁

    各位对 “锁” 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共…

    数据库 2023年6月6日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球