Filter 过滤器 Listener 监听器

news2024/11/25 6:41:08

Filter

  1. web中的过滤器当用户访问服务器资源时,过滤器将请求拦截下来,完成一些通用的操作
  2. 应用场景如:登录验证、统一编码处理、敏感字符过滤

编写filter对目标资源servlet进行拦截

1. 编写java类,实现filter接口
public class QuickFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}
	/**
	* 此方法拦截用户请求
	* @param servletRequest :请求对象
	* @param servletResponse :响应对象
	* @param filterChain :过滤器链(是否放行)
	*/
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		System.out.println("QuickFilter拦截了请求...");
		// 放行
		filterChain.doFilter(servletRequest, servletResponse);
	}
	
	@Override
	public void destroy() {}
}

② 配置web.xm

<?xml version="1.0" encoding="UTF-8"?>
<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_3_1.xsd"
version="3.1">
<!--注册filter-->
<filter>
	<filter-name>QuickFilter</filter-name>
	<filter-class>com.lagou.a_quick.QuickFilter</filter-class>
</filter>
<!--配置filter拦截路径-->
<filter-mapping>
	<filter-name>QuickFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

Filter 工作原理

在这里插入图片描述

生命周期

  1. 生命周期:指的是一个对象从生(创建)到死(销毁)的一个过程

    // 初始化方法
    public void init(FilterConfig config);
    // 执行拦截方法
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain);
    // 销毁方法
    public void destroy();
    
  • 创建:服务器启动项目加载,创建filter对象,执行init方法(只执行一次)
  • 运行(过滤拦截):用户访问被拦截目标资源时,执行doFilter方法
  • 销毁:服务器关闭项目卸载时,销毁filter对象,执行destroy方法(只执行一次)
  • 补充:过滤器一定是优先于servlet创建的
// @WebFilter(value = "/show.jsp"})
public class LifecycleFilter implements Filter {
/*
filterConfig 它是filter的配置对象
注意作用:获取filter的初始化参数
*/

private String encode;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
	System.out.println("LifecycleFilter创建了...执行init方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
	servletResponse, FilterChain filterChain) throws IOException, ServletException {
	System.out.println("LifecycleFilter拦截了请求...执行deFilter方法");
	// 放行
	filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
	System.out.println("LifecycleFilter销毁了...执行destroy方法");
	}
}

拦截路径

  1. 在开发时,可指定过滤器的拦截路径来定义拦截目标资源的范围
  • 精准匹配:用户访问指定目标资源(/show.jsp)时,过滤器进行拦截
  • 目录匹配:用户访问指定目录下(/user/*)所有资源时,过滤器进行拦截
  • 后缀匹配:用户访问指定后缀名(*.html)的资源时,过滤器进行拦截
  • 匹配所有:用户访问该网站所有资源(/*)时,过滤器进行拦截
// @WebFilter("/show.jsp") 精准匹配
// @WebFilter("/user/*") // 目录匹配
// @WebFilter("*.html") // 后缀匹配
@WebFilter("/*") // 匹配所有
public class UrlPatternFilter implements Filter {
	public void init(FilterConfig config) throws ServletException {
	}
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
		System.out.println("UrlPatternFilter拦截了请求...");
		// 放行
		chain.doFilter(servletRequest, servletResponse);
	}
	public void destroy() {}
}

过滤器链

  1. 在一次请求中,若我们请求匹配到了多个filter,通过请求就相当于把这些filter串起来了,形成了过滤器链

    * 需求
    用户访问目标资源 /targetServlet时,经过 FilterA FilterB
    * 过滤器链执行顺序 (先进后出)
    1.用户发送请求
    2.FilterA拦截,放行
    3.FilterB拦截,放行
    4.执行目标资源 show.jsp
    5.FilterB增强响应
    6.FilterA增强响应
    7.封装响应消息格式,返回到浏览器
    * 过滤器链中执行的先后问题....
    配置文件
    谁先声明,谁先执行
    <filter-mapping>
    

在这里插入图片描述

Listener 监听器

  1. 在java程序中,有时需要监视某些事情,一旦被监听的对象发生相应的变化,应该采取相应的操作。
  2. 监听web三大域对象:HttpServletRequest、HttpSession、ServletContext 通过监听器监听三大域对象它们的创建和销毁
  3. 历史访问次数、统计在线人数、系统启动时初始化配置信息

Listener 监听器简介

  1. 监听器在web开发中使用的比较少,见的机会就更少了,所以使用ServletContextListenner来学习下监听器,因为这个监听器是监听器中使用率最高的一个,且监听器的使用方式都差不多。我们使用这个监听器可以在项目启动和销毁的时候做一些事情,例如,在项目启动的时候加载配置文件。
ServletContextListener接口的API介绍:
void contextDestroyed(ServletContextEvent sce) 监听servletcontext销毁
void contextInitialized(ServletContextEvent sce) 监听servletcontext创建

监听器的使用

  1. 创建一个类实现ServletContextListenner接口
  2. 实现ServletContextListenner的contextInitialized和contextDestroyed方法。
  3. 给这个类在xml中配置
package com.code.listenner;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListenner1 implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent servletContextEvent) {
		System.out.println("服务器启动,servletContext被创建了");
	}
	@Override
	public void contextDestroyed(ServletContextEvent servletContextEvent) {
		System.out.println("服务器停止,servletContext被销毁了");
	}
}

web.xml配置如下:

<listener>
	<listener-class>com.code.listenner.MyServletContextListenner1</listenerclass>
</listener>

使用如下接口以相同的方式也可以监听到session对象和request对象的创建和销毁

```clike
HttpSessionListener:监听Httpsession域的创建与销毁的监听器
ServletRequestListener:监听ServletRequest域的创建与销毁的监听器
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧医院人员定位系统解决方案,助力医院安全管理智能化

随着经济的发展与生活质量的提升&#xff0c;人们对医疗健康的重视度越来越高&#xff0c;医疗行业也因此蓬勃发展起来。然而&#xff0c;不断扩大的经营规模也给医院安全管理带来挑战和难题。 医院安全管理痛点 1、医疗事件信息获取不及时甚至存在瞒报现象&#xff0c;管理者…

yc博客项目创建-白手起家

初始化项目 1、码云创建代码库 2、下载码云项目到本地 3、IDEA直接生成springboot项目 接入mysql 1、配置文件 2、代码配置 启动项目 访问项目 访问连接&#xff1a; http://localhost:8089/yc-blog/index/listlistContent 注意点&#xff1a;server.servlet.context-path…

Redis用于全局ID生成器、分布式锁的解决方案

全局ID生成器 每个店铺都可以发布优惠卷 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增id就存在一些问题&#xff1a; 1.id的规律性太明显 2.受单表数据量的限制 全局ID生成器&#xff0c;是一种在分布式系…

极光笔记 | 如何在Shopify中使用EngageLab (下)

Sendgird发布的《2022 Global Messaging Engagement Report》中揭示了世界各地的用户更喜欢用哪种方式与品牌互动&#xff0c;结论是&#xff1a;“电子邮件仍然是第一名&#xff08;短信紧随其后&#xff09;”。4800多名受访者中&#xff0c;有18%的人将电子邮件列为他们最常…

普通人是否能从ChatGPT中分一杯羹?

ChatGPT3.0刚刚推出&#xff0c;最开始的时候&#xff0c;人们只是将ChatGPT看作一个很会聊天的机器人&#xff0c;无论问题多么天马行空&#xff0c;它的答案看上去都有理有据。后来&#xff0c;像打开潘多拉魔盒一样&#xff0c;很多人开始拿它编大纲、撰写文案、编代码、创作…

Docker本地推送到hub,以及上传时遇到的问题解决

1.在本地创建一个 Dockerfile FROM ubuntu:latest RUN apt-get update && apt-get install -y curl CMD ["curl", "https://www.baidu.com"]2.在本地构建 Docker 镜像 在创建本地docker镜像的时候[TAG] .和[TAG] /PATH/TO 需要注意dockerfile文件…

ATTCK v12版本战术介绍——防御规避(二)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术、防御规避&#xff08;一&#xff09;理论知识及实战研究&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术&#xff08;二&#xff09;&#xff0c;包括防御…

【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

&#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 ⭐栈的分类 ✨顺序栈 &#x1f388;优点&#xff1a; &…

离线安装k8sv1.20.5版本并部署服务

注意&#xff1a;我这里的离线安装包是V1.20.5的&#xff0c;单安装一个master节点并部署服务&#xff0c;保证可以使用。如果安装集群也是可以的&#xff0c;但是需要把离线包上传到所有的node节点&#xff0c;导入&#xff0c;最后把node节点接入到K8S集群即可&#xff0c;本…

js flyout 2: VScroll

目录版权描述测试页面showFlyout问题1 - scroll 实现可能不准?问题2 - 容器内容重排可导致浮层错位关于重排小结附录 - 完整代码版权 本文为原创, 遵循 CC 4.0 BY-SA 版权协议, 转载需注明出处: https://blog.csdn.net/big_cheng/article/details/130101031. 文中代码属于 pu…

【致敬未来的攻城狮计划】学习总结

文章目录【致敬未来的攻城狮计划】学习总结前言学习总结一、RT-Thread二、RA2E1开发板三、学习移植RT-Thread四、学习RT-Thread设备五、其他收获六、总结【致敬未来的攻城狮计划】学习总结 &#x1f680;&#x1f680;开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客…

【RabbitMQ学习日记】——死信队列与延迟队列

一、死信队列 1.1 相关概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c;consumer 从 queue 取出消息进行消费&#xff0c;但某些时候由…

云擎未来,智信天下 | 2023移动云大会来了!

新三年&#xff0c;新征程 2023年作为新三年开局之年 移动云又将以怎样的 全新品牌形象、全新战略规划 向“一流云服务商”战略目标勇毅前行&#xff1f; 答案就在这里&#xff1a; 2023移动云大会&#xff0c;官宣定档&#xff01; 2023.4.25 - 4.26 苏州金鸡湖国际会…

MATLAB配置C/C++库(Visual Studio,MinGW-w64 C/C++ 编译器)问题(包括低版本matlab配置高版本VS)

问题描述 使用matlab加载C语言的库函数时&#xff0c;需要提前配置好C/C编译器&#xff0c;否则在matlab中使用 loadlibrary 加载C /C库中的函数时候&#xff0c;会报错&#xff1a; “未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C 编译器&#xff1b;请参…

软考第三章 广域通信网

广域通信网 1.公共交换电话网 公共交换电话网PSTN&#xff1a;是为了话音通信而建立的网络&#xff0c;在有些地方用户仍然通过电话线拨号上网 1.1 电话系统的结构 电话系统是一个高度冗余的分级网络。用户电话通过一对铜线连接到最近的端局。 公共电话网由本地网和长途网组…

一文速学数模-最优化算法(二)梯度下降算法一文详解+Python代码

目录 前言 一、梯度下降法简述 二、梯度下降算法原理理解 1.梯度 2.梯度定义 3.梯度下降 4.损失函数(loss function) 5.学习率(步长) 三、梯度下降算法代码展示 消失和爆炸梯度 前言 最近会不断更新深度学习系列文章(全实战性可运行代码)加入到我的一文速学-数学建模…

Git项目同时推送到GitHub和Gitee详细操作

文章目录前言一、创建仓库【Create a new repository】二、初始化三、配置公钥四、密钥验证五、代码推送总结前言 将Git项目同时推送到GitHub和Gitee的好处如下&#xff1a; 提高代码可见性和协作性&#xff1a;GitHub和Gitee都是知名的代码托管平台&#xff0c;推送代码到这两…

大数据能力提升项目|学生成果展系列之五

导读为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

JavaScript【十】JavaScript事件

文章目录&#x1f31f;前言&#x1f31f;事件&#x1f31f;绑定事件的方式&#xff1a;&#x1f31f;标签绑定事件&#xff1a;&#x1f31f;Document对象来绑定事件&#xff1a;on事件type&#x1f31f; 事件监听:使同一个对象的同一事件绑定多个事件处理程序。兼容IE9及以上。…

Zephyr RTOS应用开发(nrf5340)

目录 概述 开发环境安装 创建一个新的Zephyr应用 构建应用并刷写到开发板 概述 Zephyr™项目是一个采用Apache 2.0协议许可&#xff0c;Linux基金会托管的协作项目。针对低功耗、小型内存微处理器设备开发的物联网嵌入式小型、可扩展的实时操作系统&#xff0c;支持多种硬件…