javaweb学习(day11-监听器Listener过滤器Filter)
一、监听器Listener
1 Listener介绍
- Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程 序、Listener 监听器、Filter 过滤器
- Listener 是 JavaEE 的规范,就是接口
- 监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成 相应的任务
- JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener
2 ServletContextListener 监听器
2.1 作用
2.2 相关方法

2.3 应用实例
package com.hspedu.listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class HspServletContextListener implements ServletContextListener {/*1. 当一个类实现了ServletContextListener时,该类就是一个监听器2. 该类可以监听的事件 由该类实现的监听接口决定3. 比如实现了ServletContextListener 则该类就可监听ServletContext对象的创建和销毁。以此类推4.HspServletContextListener就是一个监听者5.当web应用启动时,就会产生一个ServletContextEvent的事件,会调用监听器的对应事件处理方法6. contextInitialized同时会传递事件对象7. 程序员可以通过ServletContextEvent事件对象来获取需要的信息,再进行业务处理8.tomcat怎么知道这个监听器的存在?因为我们需要在web.xml配置*/@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {ServletContext servletContext =servletContextEvent.getServletContext();System.out.println("监听到了"+servletContext+"被创建");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {ServletContext servletContext =servletContextEvent.getServletContext();System.out.println("监听到了"+servletContext+"被销毁");}
}
2.4 配置 web.xml

3 ServletContextAttributeListener 监听器
3.1 介绍
3.2 案例
创建ServletContextAttributeListener
package com.hspedu.listener;import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;public class MyServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("添加了 servletContext 属性名= " + servletContextAttributeEvent.getName() + " 属 性 值 =" +servletContextAttributeEvent.getValue());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("删除了 servletContext 属性名= " + servletContextAttributeEvent.getName() + " 属 性 值 =" +servletContextAttributeEvent.getValue());}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {//拿到的属性是修改之前的System.out.println("替换了 servletContext 属性名= " + servletContextAttributeEvent.getName() + " 属 性 值 =" +servletContextAttributeEvent.getValue());}
}
创建Servlet
package com.hspedu.servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class HiServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给ServletContext添加相关的属性ServletContext servletContext =request.getServletContext();servletContext.setAttribute("name","linran");servletContext.setAttribute("name","lin");servletContext.removeAttribute("name");System.out.println("HoServlet 处理完毕");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}
4 其它监听器
4.1 HttpSessionListener 监听器
作用:监听 Session 创建或销毁,即生命周期监听
相关方法

4.2 HttpSessionAttributeListener 监听器
4.3 ServletRequestListener 监听器
作用:监听 Request 属性变化
相关方法

4.4 ServletRequestListener 监听器
作用:监听 Request 创建或销毁,即 Request 生命周期监听
相关方法

可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况
二、过滤器 Filter
1 Filter 过滤器说明
1.1 为啥要过滤器

1.2 过滤器介绍
- Filter 过滤器它是 JavaWeb 的三大组件之一(Servlet 程序、Listener 监听器、Filter 过滤器)
- Filter 过滤器是 JavaEE 的规范,是接口
- Filter 过滤器它的作用是:拦截请求,过滤响应。
1.3 应用场景
2 Filter 过滤器基本原理

3 Filter 过滤器快速入门
3.1 需求

3.2 login.jsp
<%--User: LinranDate: 2024/4/2Time: 16:44Version: 1.0To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>管理后台登录</title>
</head>
<body><h1>管理后台登录</h1><form action="<%=request.getContextPath()%>/loginCheckServlet" method="post">u:<input type="text" name="username"><br><br>p:<input type="password" name="password"><br><br><input type="submit" value="用户登录"></form></body>
</html>
3.3 LoginCLServlet
package com.hspedu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class LoginCheckServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取用户名和密码//假设密码是123456就可以通过String username=request.getParameter("username");String password=request.getParameter("password");if("123456".equals(password)){//加入sessionHttpSession session = request.getSession();session.setAttribute("username",username);session.setAttribute("password",password);request.getRequestDispatcher("/manage/admin.jsp").forward(request,response);}else {request.getRequestDispatcher("/login.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}
3.4 admin.jsp
<%--User: LinranDate: 2024/4/2Time: 16:48Version: 1.0To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>后台管理</title><base href="<%=request.getContextPath()%>/manage/">
</head>
<body><h1>后台管理</h1><a href="#"> 用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a><hr>
<img src="1.jpeg">
</body>
</html>
3.5 ManageFilter
package com.hspedu.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class ManageFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//当Tomcat 创建filter后会调用该方法进行初始化System.out.println("ManageFilter init 被调用.....");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//当每次调用该filter时,dofilter就会被调用System.out.println("ManageFilter doFilter 被调用");//如果这里没有调用继续请求的方法,则停止在这//如果继续访问目标资源//在调用过滤器之前,request对象已经被创建并封装//所以这里就可以通过servletRequest来获取很多信息,比如访问的url\session\数据HttpServletRequest httpServletRequest =((HttpServletRequest) servletRequest);HttpSession session = httpServletRequest.getSession();//获取username session对象Object username = session.getAttribute("username");if(username!=null){//用户登录过,直接放行filterChain.doFilter(servletRequest,servletResponse);//继续访问目标资源//servletRequest,servletResponse会传递给目标资源//}else {servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);}}@Overridepublic void destroy() {//当filter被销毁时,就会调用该方法System.out.println("ManageFilter destroy 被调用");}
}
3.6 web.xml
<?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_4_0.xsd"version="4.0"><!--filter一般写在最前面1. 我们可以发现filter配置和servlet是十分相似的,filter也是被tomcat管理和维护的2. url-pattern就是当请求的url和匹配的时候,就会调用该filter‘3. /manage/* 第一个/解析成http://ip:port/工程路径4:完整的路径就是http://ip:port/工程路径/manage/* 当请求的资源url满足该条件时都会调用filter--><filter><filter-name>ManageFilter</filter-name><filter-class>com.hspedu.filter.ManageFilter</filter-class></filter><filter-mapping><filter-name>ManageFilter</filter-name><url-pattern>/manage/*</url-pattern></filter-mapping><servlet><servlet-name>LoginCheckServlet</servlet-name><servlet-class>com.hspedu.servlet.LoginCheckServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginCheckServlet</servlet-name><url-pattern>/loginCheckServlet</url-pattern></servlet-mapping></web-app>
4 Filter 过滤器 url-pattern
- url-pattern : Filter 的拦截路径, 即浏览器在请求什么位置的资源时,过滤器会进行拦截过滤
- 精确匹配 <url-pattern>/a.jsp</url-pattern> 对应的 请求地址 http://ip[域名]:port/工程路径/a.jsp 会拦截
- 目录匹配 <url-pattern>/manage/*</url-pattern>对应的 请求地址 http://ip[域名]:port/工程路径/manage/xx , 即 web 工程 manage 目录下所有资源 会拦截
- 后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应的请求地址 http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截
- Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在
5 Filter 过滤器生命周期

6 FilterConfig

- FilterConfig 是 Filter 过滤器的配置类
- Tomcat 每次创建 Filter 的时候,也会创建一个 FilterConfig 对象,这里包含了 Filter 配置文件的配置信息。
- FilterConfig 对象作用是获取 filter 过滤器的配置内容
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;public class FilterConfig_ implements Filter {/*演示FilterConfig的使用*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//通过filterConfig获取相关参数String filterName =filterConfig.getFilterName();System.out.println("filterName="+filterName);String ip =filterConfig.getInitParameter("ip");System.out.println("ip="+ip);ServletContext servletContext =filterConfig.getServletContext();System.out.println("servletContext="+servletContext);Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()){System.out.println("名字 :"+initParameterNames.nextElement());}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic void destroy() {}
}
web.xml
7 FilterChain 过滤器链
7.1 AFilter
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;public class AFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("=======AFilter doFilter()前置处理代码=======");chain.doFilter(req, resp);System.out.println("=======AFilter doFilter()后置处理代码=======");}public void init(FilterConfig config) throws ServletException {}}
7.2 BFilter
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;public class AFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("=======AFilter doFilter()前置处理代码=======");chain.doFilter(req, resp);System.out.println("=======AFilter doFilter()后置处理代码=======");}public void init(FilterConfig config) throws ServletException {}}
7.3 hi.jsp
<%--User: LinranDate: 2024/4/2Time: 20:14Version: 1.0To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>hi</title>
</head>
<body>
<h1>admin 目录下的 hi.jsp</h1>
<h1>后台管理</h1>
<a href="#">用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a>
<hr/>
</body>
</html>
7.4 web.xml

8 FilterChain 注意事项和细节
- 多个 filter 和目标资源在一次 http 请求,在同一个线程中
- 当一个请求 url 和 filter 的 url-pattern 匹配时, 才会被执行, 如果有多个匹配上,就会顺序执行,形成一个 filter 调用链(底层可以使用一个数据结构搞定
- 多个 filter 共同执行时,因为是一次 http 请求, 使用同一个 request 对象
- 多个 filter 执行顺序,和 web.xml 配置顺序保持一致.
- chain.doFilter(req, resp)方法 将执行下一个过滤器的 doFilter 方法, 如果后面没有过滤器,则执行目标资源。
- 小结:注意执行过滤器链时, 顺序是(用前面的案例分析) Http请求 -> A 过滤器 dofilter() -> A 过滤器前置代码 -> A 过滤器 chain.doFilter() -> B 过滤器 dofilter() -> B 过滤器前置代 码 -> B过滤器 chain.doFilter() -> 目标文件 -> B过滤器后置代码 -> A过滤器后置代码 -> 返回给浏览器页面/数据
相关文章:
javaweb学习(day11-监听器Listener过滤器Filter)
一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范,就是接口 监听器的作用是,监听某种变化(一般就是对…...
教你快速认识Java中的抽象类和接口
目录 引言 抽象类(Abstract Class) 抽象类的概念 抽象类的图标 抽象类的语法 抽象类的特点 接口(Interface) 接口的概念 接口的图标 接口的语法 接口的特点 接口的使用 接口的意义 抽象类与接口的区别 Object类 结…...
Linux第5课 Linux目录介绍
文章目录 Linux第5课 Linux目录介绍一、打开系统目录二、查看系统目录 Linux第5课 Linux目录介绍 系统目录就是指操作系统的主要文件存放的目录,目录中的文件直接影响到系统是否正常工作,了解这些目录的功能,对使用系统会有很大的帮助。 一…...
GitHub要求2FA?不慌,有它(神锁离线版)帮你!
GitHub宣布,到 2023 年底,所有用户都必须要启用双因素身份验证 (2FA),不能只用密码啦。 说实话,听到这消息小编是非常高兴的。 正如GitHub的首席安全官Mike Hanley所说,软件供应链是从开发者开始的,保护开…...
C语言第四十弹---预处理(下)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 预处理 1、#和## 1.1 #运算符 1.2、##运算符 2、命名约定 3、#undef 4、命令行定义 5、条件编译 6、头文件的包含 6.1、头文件被包含的方式 6.1.1、本地…...
SYS-2722音频分析仪SYS2722
181/2461/8938产品概述: Audio Precision 2722 音频分析仪是 Audio Precision 屡获殊荣的 PC 控制音频分析仪的旗舰型号,长期以来一直是音频设备设计和测试的全球公认标准。功能齐全的 SYS-2722 提供了测试转换器技术最新进展所需的无与伦比的失真和噪声…...
下载页面上的视频
引言:有些页面上的视频可以直接右键另存为或者F12检索元素找到视频地址打开后保存,但有些视频页面是转码后的视频,不能直接另存为视频格式,可以参考下本方法 以该页面视频为例:加载中...点击查看详情https://wx.vzan.c…...
静态路由协议实验综合实验
需求: 1、除R5的换回地址已固定外,整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口,用于模拟连接PC的网段;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…...
qt MVC软件设计模式
在Qt中使用MVC(Model-View-Controller)软件设计模式可以帮助你将数据模型、用户界面和控制逻辑有效地分离,从而使得代码更清晰,更易于维护和扩展。以下是在Qt中使用MVC模式的一般思路: Model(模型ÿ…...
代码随想录刷题随记15-二叉树回溯
代码随想录刷题随记15-二叉树回溯 110.平衡二叉树 leetcode链接 一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 求深度和求高度的区别: 求深度可以从上到下去查 所以需要前序遍历(中左右ÿ…...
基于SpringBoot Vue养老院管理
一、📝功能介绍 基于SpringBoot Vue养老院管理 角色:管理员、企业、老人子女、老人 管理员:管理员登录进入养老院管理系统可以对系统首页、个人中心、服务人员管理、老人管理、老人子女管理、老人档案管理、社区活动管理、活动记录管理、床…...
盘点编程方法论中的一些思想
背景 在日常编程开发中,虽然不同公司,业务不同,语言不同,但是工作久了,我们会发现一些编程思想几乎是不变的。这些编程思想,往往来自于大量实际问题场景的方法总结,可以很好的应对某一类问题。如…...
通过电机转速计算主轴旋转单圈所需时间(CODESYS ST代码)
1、伺服丝杠系统常用算法功能块 伺服丝杠系统常用算法功能块-CSDN博客文章浏览阅读353次。这篇博客主要介绍伺服、丝杠系统常用的运算功能块,其它相关运算可以查看下面文章链接:信捷PLC脉冲频率、位移、转速相关计算(C语言编程应用)_RXXW_Dor的博客-CSDN博客。https://rxxw-…...
多线程的入门(二)线程实现与初步使用
1.实现Runable接口 实现Runable接口,实现run方法; 这种方式创建的线程实现类执行时需要创建Thread实例去运行该任务 示例如下: package com.example.springbootdamo.Thread;import org.apache.logging.log4j.LogManager; import org.apach…...
数据结构(初阶)第二节:顺序表
数据结构(初阶)第一节:数据结构概论-CSDN博客 从本文正式进入对数据结构的讲解,开始前友友们要有C语言的基础,熟练掌握动态内存管理、结构体、指针等章节,方便后续的学习。 目录 顺序表(Sequen…...
鸿蒙OS元服务开发:【(Stage模型)设置应用主窗口】
一、设置应用主窗口说明 在Stage模型下,应用主窗口由UIAbility创建并维护生命周期。在UIAbility的onWindowStageCreate回调中,通过WindowStage获取应用主窗口,即可对其进行属性设置等操作。还可以在应用配置文件中设置应用主窗口的属性&…...
lua学习笔记6(经典问题输出99乘法表)
print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字,用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…...
物联网行业中,我们如何选择数据库?
在当今数字化潮流中,我们面对的不仅是海量数据,更是时间的涟漪。从生产线的传感器到金融市场的交易记录,时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时,我们需要深入了解一种强大的工具——时序数…...
openstack云计算(一)————openstack安装教程,创建空白虚拟机,虚拟机的环境准备
1、创建空白虚拟机 需要注意的步骤会截图一下,其它的基本都是下一步,默认的即可 ----------------------------------------------------------- 2、在所建的空白虚拟机上安装CentOS 7操作系统 (1)、在安装CentOS 7的启动界面中…...
Linux存储的基本管理
实验环境: 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称: SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
