Listener监听器和Filter过滤器

一.监听器

1.是javaweb的三大组件之一,分别是Servlet程序,Listener监听器,Filter过滤器
2.Listener是JvaEE的规范,就是接口,监听器的作用就是监听某种变化(一般是对象创建/销毁,属性变化),触发对应方法完成相应的任务
3.ServletContextListener:
/*当一个类实现了ServletContextListener,该类就是一个监听器* 该类可以监听的事件由该类实现的接口决定,比如下面该类就能监听ServletContext对象的创建和销毁*  当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法contextInitialized* 同时会传递事件对象,程序员通过ServletContextEvent事件对象来获取需要的信息,然后处理业务* tomcat怎么知道这个监听器存在? 因为需要在web.xml文件中配置*/
public class HspServletContextListener implements ServletContextListener {@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+"被销毁");}
}

4.ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext的属性变化

public class HspServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener监听到添加属性"+servletContextAttributeEvent.getName()+"" +"="+servletContextAttributeEvent.getValue());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener监听到删除属性"+servletContextAttributeEvent.getName()+"" +"="+servletContextAttributeEvent.getValue());}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener监听到替换属性"+servletContextAttributeEvent.getName()+"" +"="+servletContextAttributeEvent.getValue());}
}

5.HttpSessionListener
HttpSessionListener即生命周期监听,用于监听用户的上线或者离线

public class HspServletSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();session.setMaxInactiveInterval(20);//设置session生命周期System.out.println("HspServletSessionListener监听到了session的创建id为"+session.getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();System.out.println("HspServletSessionListener监听到了session的销毁:"+session.getId());}
}

6.HttpSessionAttributeListener 用于监听session属性的变化
7.ServletRequestListener监听器用于监听Request创建或者销毁,即Request生命周期监听,也是监控某个ip访问网站的频率,记录访问日志
8.ServletRequestAttributeListener监听器用于监听request属性变化

二.过滤器

1.过滤器是JavaEE的规范,是接口.作用是拦截请求,过滤响应基本原理如下

在这里插入图片描述
请求转发方式不会经过过滤器
当客户端发送一个请求到 Tomcat 服务器时,请求会先经过 Filter 的 doFilter 方法进行预处理。在 doFilter 方法中,可以对请求进行修改,如设置字符编码、验证用户权限等。然后调用 FilterChain 的 doFilter 方法将请求传递给下一个 Filter 或 Servlet 进行处理。当 Servlet 处理完请求并生成响应后,响应会再次经过 Filter 的 doFilter 方法进行后处理,最后返回给客户端。

public class ManageFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//当Tomcat创建Filter实例后,就会调用filter的无参构造器,调用该nint方法进行初始化.System.out.println( "ManageFilter init方法被调用");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//当每次调用该filter时,就会调用该方法System.out.println("doFilter被调用");//继续访问目标资源,在调用过滤器前,servletRequest对象=request已经被创建并且封装//所以就可以通过servletRequest获取很多信息,比如访问url,session//获取sessionHttpSession session = ((HttpServletRequest) servletRequest).getSession();if(session.getAttribute("username")!=null){//下面这个语句相当于放行filterChain.doFilter(servletRequest,servletResponse);}else {//没有登陆过,回到登录页面\servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);}}@Overridepublic void destroy() {
//每次销毁filter时,就会调用该方法System.out.println("ManageFilter被销毁");}
}

2.Filter生命周期
当Tomcat创建Filter实例(只会创建一个,并且常驻内存)后,就会调用filter的无参构造器,调用该nint方法进行初始化.同时tomcat创建一个FilterConfig对象同时通过init方法传入
当一个http请求和该filter的url-patter匹配时,就会调用doFilter方法,同时会创建servletRequest,servletResponse,filterChain,通过doFilter传入,后面的请求资源若使用到requst和response,则是同一个会继续传递使用.停止web工程,销毁Filter就是调用destory

3.FilterConfig
FilterConfig是Filter过滤器的配置类,Tomcat每次创建Filter的时候,也会创建一个FilteConfig对象,这里包含了filter配置文件的配置信息

!--配置的参数,由程序员自己设计--><init-param><param-name>ip</param-name><param-value>127.0</param-value></init-param><init-param><param-name>port</param-name><param-value>8888</param-value></init-param></filter><filter-mapping><filter-name>HspFilterConfig</filter-name><url-pattern>/abc/*</url-pattern></filter-mapping>
public class HspFilterConfig implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//通过filterConfig获取相关的参数//获取filter的名字,ipString filterName = filterConfig.getFilterName();String ip = filterConfig.getInitParameter("ip");ServletContext servletContext = filterConfig.getServletContext();//可以获取到该Filter所有的配置参数名Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();//遍历枚举while(initParameterNames.hasMoreElements()){System.out.println("名字是:"+initParameterNames.hasMoreElements());}System.out.println("fileName="+filterName);System.out.println("ip="+ip);System.out.println("servletContext="+servletContext)}
}

4.过滤器链
流程图:
在这里插入图片描述
注意事项:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 中的 7 个常见接口错误

Go 仍然是一门新语言,如果你正在使用它,它很可能不是你的第一门编程语言。 不同的语言,既为你带来了经验,也带来了偏见。你用以前的任何语言做的事情,在 Go 中用相同的方法可能不是一个好主意。 学习 Go 不仅仅是学习一种新的语法。这也是学习一种新的思维方式来思考你的…

【AI实践】Cursor上手-跑通Hello World和时间管理功能

背景 学习目的&#xff1a;熟悉Cursor使用环境&#xff0c;跑通基本开发链路。 本人背景&#xff1a;安卓开发不熟悉&#xff0c;了解科技软硬件常识 实践 基础操作 1&#xff0c;下载安装安卓Android Studio 创建一个empty project 工程&#xff0c;名称为helloworld 2&am…

存储系统、网盘系统的访问留痕

一、适用场景 1、需要了解是否存在非法访问存储系统或网盘系统&#xff1a;各企业或单位为方便远程办公或远程管理&#xff0c;若自建&#xff08;保护隐私数据或敏感资料&#xff09;了存储系统或网盘系统&#xff0c;那么到底有哪些ip地址或用户从远程公网访问存储系统或网盘…

求助DeepSeek帮我开发一个直线审批流程设计页面Vue2.0

之前使用文心一言协助开发过类似的页面&#xff0c;需求方认为某些业务表单需要添加审批流程&#xff0c;可以人为设置审批步骤&#xff0c;由于需求很模糊而且人/天有限&#xff0c;当时的提问很混乱&#xff0c;内容如下&#xff1a; 我的vue2.0系统中需要审批流程设计页面&a…

初级数据结构:栈和队列

目录 一、栈 (一)、栈的定义 (二)、栈的功能 (三)、栈的实现 1.栈的初始化 2.动态扩容 3.压栈操作 4.出栈操作 5.获取栈顶元素 6.获取栈顶元素的有效个数 7.检查栈是否为空 8.栈的销毁 9.完整代码 二、队列 (一)、队列的定义 (二)、队列的功能 (三&#xff09…

LLM:DeepSeek 系列(二)

原文链接 3、DeepSeek-V2 DeepSeek-V2 发布于 2024 年 5 月&#xff0c;为多领域专家&#xff08;MoE&#xff09;语言模型&#xff0c;包含总共 2360 亿个参数&#xff0c;其中每个词元激活 210 亿个参数&#xff0c;并支持 12.8 万个词元的上下文长度。DeepSeek-V2 采用包括…

【学术投稿】第五届计算机网络安全与软件工程(CNSSE 2025)

重要信息 官网&#xff1a;www.cnsse.org 时间&#xff1a;2025年2月21-23日 地点&#xff1a;中国-青岛 简介 第五届计算机网络安全与软件工程&#xff08;CNSSE 2025&#xff09;将于2025年2月21-23日在中国-青岛举行。CNSSE 2025专注于计算机网络安全、软件工程、信号处…

开源项目介绍-词云生成

开源词云项目是一个利用开源技术生成和展示词云的工具或框架&#xff0c;广泛应用于文本分析、数据可视化等领域。以下是几个与开源词云相关的项目及其特点&#xff1a; Stylecloud Stylecloud 是一个由 Maximilianinir 创建和维护的开源项目&#xff0c;旨在通过扩展 wordclou…

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

2025年日祭

本文将同步发表于洛谷&#xff08;暂无法访问&#xff09;、CSDN 与 Github 个人博客&#xff08;暂未发布&#xff09; 本蒟自2025.2.8开始半停课。 任务计划&#xff08;站外题与专题&#xff09; 数了一下&#xff0c;通过人数比较高的题&#xff0c;也就是我准备补的题&a…

UIAbility 生命周期方法

生命周期流程图 UIAbility的生命周期官方文档地址https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/uiability-lifecycle-V13 1. onCreate(want: Want, launchParam: LaunchParam) 触发时机&#xff1a;Ability首次创建时 作用&#xff1a;初始化核心资源…

模型 冗余系统(系统科学)

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。为防故障、保运行的备份机制。 1 冗余系统的应用 1.1 冗余系统在企业管理中的应用-金融行业信息安全的二倍冗余技术 在金融行业&#xff0c;信息安全是保障业务连续性和客户资产安全的关键。随着数字化…

【大数据技术】Spark分布式实现词频统计(hadoop+python+spark)

Spark分布式实现词频统计&#xff08;hadooppythonspark&#xff09; 搭建完全分布式高可用大数据集群&#xff08;VMwareCentOSFinalShell&#xff09; 搭建完全分布式高可用大数据集群&#xff08;HadoopMapReduceYarn&#xff09; 本机PyCharm远程连接CentOS虚拟机&#x…

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…

C++Primer学习(2.2)

2.2 变量 变量提供一个具名的、可供程序操作的存储空间。C中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围&#xff0c;以及变量能参与的运算。对C程序员来说,“变量(variable)”和“对象(object)”一般可以互换使用。 术…

电脑开机提示按f1原因分析及终极解决方法来了

经常有网友问到一个问题&#xff0c;我电脑开机后提示按f1怎么解决&#xff1f;不管理是台式电脑&#xff0c;还是笔记本&#xff0c;都有可能会遇到开机需要按F1&#xff0c;才能进入系统的问题&#xff0c;引起这个问题的原因比较多&#xff0c;今天小编在这里给大家列举了比…

Linux系统命令无法使用(glib库相关问题)

1.背景描述 Yum强制安装了一些软件&#xff0c;安装软件成功无报错&#xff0c;完成后不久突然发现系统出问题了&#xff0c;所有的命令无法使用了&#xff0c;如ls、mv、cat等基本命令报错。 relocation error&#xff1a; /lib64/libpthread.so.0: symbol_libc_dl_error_tsd …

Jupyter Notebook自动保存失败等问题的解决

一、未生成配置文件 需要在命令行中&#xff0c;执行下面的命令自动生成配置文件 jupyter notebook --generate-config 执行后会在 C:\Users\用户名\.jupyter目录中生成文件 jupyter_notebook_config.py 二、在网页端打开Jupyter Notebook后文件保存失败&#xff1b;运行代码…

【含文档+PPT+源码】基于Python校园跑腿管理系统设计与实现

项目介绍 本课程演示的是一款基于Python校园跑腿管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…

TypeScript 中的联合类型:灵活的类型系统

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…