SpringBoot监听器的使用方法

监听器(Listener)就是监听对象的创建、销毁等状态的变化以及定义一些事件发生后接下来要进行的动作。主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域。本文通过几个简单的例子介绍一下监听器的用法。

监听 Servlet 上下文对象可以在系统启动的时候初始化一些数据,方便在使用的时候直接调用。使用ServletContextListener监听 Servlet上下文,监听器实现代码如下:

@Component
public class MyServletContextListener implements ServletContextListener {@Override    //在 ServletContext 对象创建之后马上调用,做初始化public void contextInitialized(ServletContextEvent event) {event.getServletContext().setAttribute("name","小马");System.out.println("ServletContext 对象被创建了");}@Override  // 在 ServletContext 对象销毁之后调用public void contextDestroyed(ServletContextEvent event) {System.out.println("ServletContext 对象被销毁了");}
}@GetMapping("/getServletContext")public String getServletContext(HttpServletRequest request) {ServletContext servletContext = request.getServletContext();Object name = servletContext.getAttribute("name");return String.valueOf(name);}

获取在线用户数量

使用HttpSessionListener获取在线用户数量,代码如下:

@Component
public class MyHttpSessionListener implements HttpSessionListener {public static Integer count = 0;@Overridepublic void sessionCreated(HttpSessionEvent event) {count++;ServletContext application = event.getSession().getServletContext();application.setAttribute("UserCount", count);System.out.println("有人上线了,现在在线人数为:" + count + "人");}@Overridepublic void sessionDestroyed(HttpSessionEvent event) {count--;ServletContext application = event.getSession().getServletContext();application.setAttribute("UserCount", count);System.out.println("有人下线了,现在在线人数为:" + count + "人");}
}
@GetMapping("/online")
public String getOnlinePersoncount(HttpServletRequest request) {Integer userCount = (Integer) request.getServletContext().getAttribute("UserCount");return (userCount == null ? "0" : userCount + "");
}
@GetMapping("/login")
public String logined(HttpSession session) {//相同的session,如果sessionid一致,只会被监听一次。session.setAttribute("username", "小马");return "success";
}
@GetMapping("/logout")
public String logout(HttpSession session) {session.invalidate();//将session设置为失效return "success";
}

统计网站访问次数

使用ServletRequestListener统计网站访问次数,代码如下:

@Component
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {Object countObject = servletRequestEvent.getServletContext().getAttribute("count");System.out.println("历史访问次数:" + countObject);Integer count = 0;if (countObject != null)count = Integer.valueOf(countObject.toString());count++;servletRequestEvent.getServletContext().setAttribute("count", count);}@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("当前访问次数:" + servletRequestEvent.getServletContext().getAttribute("count"));}
}

自定义监听方式

定义监听事件

public class ListenerEvent extends ApplicationEvent {String name = null;public String getName() {return name;}public void setName(String name) {this.name = name;}public ListenerEvent(Object source, String value) {super(source);name = value;}
}

定义监听器

@Component
public class MySpringBootListener implements ApplicationListener<ListenerEvent> {@Overridepublic void onApplicationEvent(ListenerEvent listenerEvent) {String eventInfo = listenerEvent.getName();System.out.println(eventInfo);}
}

发布事件

@RestController
public class ListenerController {@Resourceprivate ApplicationContext applicationContext;@GetMapping("/listener")public String listener() {ListenerEvent event =new ListenerEvent(this,"小马");applicationContext.publishEvent(event);return "";}
}

监听器生命周期

request
指一个URL请求,当发送一个请求时被创建,当一个响应返回时,即被销毁。

session
当一个客户端访问一个WEB应用时创建,标记一个用户与服务器之间的多次请求。session失效有以下几个情况:

1、session 过期,即用户长时间不访问服务器造成过期
2、用户退出系统,即执行session 的 invalidate 方法,清理session
3、当前 web 应用被卸载(session 未被持久化)

application
贯穿于当前的 WEB 应用的生命周期,当前 WEB 应用被加载时创建 application 对象,当前 WEB 应用被卸载时销毁 application 对象。

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

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

相关文章

【论文笔记】Sign Language Video Retrieval with Free-Form Textual Queries

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Sign Language Video Retr…

FastGRPC 使用简介

简介 FastGRPC 是一个基于 Python 3.9 的轻量级 gRPC 框架&#xff0c;旨在简单快速高效的构建 gRPC 服务。 安装 使用 pip 安装 FastGRPC&#xff1a; pip install python-fast-grpc快速开始 创建简单的 gRPC 服务 以下是一个快速实现的示例&#xff1a; from pydantic …

openEuler22.03系统使用Kolla-ansible搭建OpenStack

Kolla-ansible 是一个利用 Ansible 自动化工具来搭建 OpenStack 云平台的开源项目&#xff0c;它通过容器化的方式部署 OpenStack 服务&#xff0c;能够简化安装过程、提高部署效率并增强系统的可维护性。 前置环境准备&#xff1a; 系统:openEuler-22.03-LTS-SP4 配置&…

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据&#xff0c;页面卡死&#xff0c;如何优化&#xff1f;&#xff1f;这里使用 分页 虚拟列表&#xff08;vue-virtual-scroll-list&#xff09;&#xff0c;去模拟一个下拉的内容…

【vue】vue的基础语法--上

目录 一、Vue的模板语法 1. 学会使用VsCode 2. 文本插值 3. 使用JavaScript表达式 4. 无效 5. 原始html 二、 属性绑定 1. 属性绑定 2.简写方案 3.布尔型Attribute 4. 动态邦定多个值 三、条件渲染 1. v-if 2. v-else 3. v-else-if 4. v-show 5. v-if VS v-sho…

【ANGULAR网站开发】初始环境搭建(SpringBoot)

1. 初始化SpringBoot 1.1 创建SpringBoot项目 清理spring-boot-starter-test&#xff0c;有需要的可以留着 1.2 application.properties 将application.properties改为yaml&#xff0c;个人习惯问题&#xff0c;顺便设置端口8888&#xff0c;和前端设置的一样 server:por…

C++编码实践,邪恶的非常量全局变量

在编程过程中,避免使用全局变量是一个良好的编程实践建议。当然,这里的全局变量主要是指 非常量全局变量; 尽管在小型项目中,这一点似乎看起来人畜无害,但是在大型项目中往往会出现很多问题。 新手程序员往往比较喜欢使用大量的全局变量,因为这样使用起来方便直接,特别是当设…

OpenCV的对比度受限的自适应直方图均衡化算法

OpenCV的对比度受限的自适应直方图均衡化&#xff08;CLAHE&#xff09;算法是一种图像增强技术&#xff0c;旨在改善图像的局部对比度&#xff0c;同时避免噪声的过度放大。以下是CLAHE算法的原理、步骤以及示例代码。 1 原理 CLAHE是自适应直方图均衡化&#xff08;AHE&…

1.1.2 配置静态IP和远程SSH登录

一、开放22端口 方法一&#xff1a;开放SSH服务&#xff08;推荐&#xff0c;不需要改动&#xff09; 查看配置文件&#xff0c;已经默认开放ssh服务端口了&#xff0c;ssh默认为22端口&#xff0c;所以不需要改动文件 方法二&#xff1a;开放22端口 &#xff08;1&#xff0…

Python离散化

离散化 离散化&#xff1a;不关注数字本身&#xff0c;只关注大小关系时&#xff0c;利用排名代替原数据 本质&#xff1a;一种哈希&#xff0c;将离散的数字、浮点数&#xff0c;转换成 1 − n 1-n 1−n 例如&#xff1a;【 100 &#xff0c; 200 &#xff0c; 300 &#…

Soildworks的学习【2025/1/12】

右键空白处&#xff0c;点击选项卡&#xff0c;即可看到所有已调用的选项卡&#xff1a; 点击机械小齿轮选项卡&#xff0c;选择文档属性&#xff0c;选择GB国标&#xff1a; 之后点击单位&#xff0c;选择MMGS毫米单位&#xff1a; 窗口右下角有MMGS&#xff0c;这里也可以选择…

web前端第五次作业---制作菜单

制作菜单 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

孤独症孩子能上职业学校吗:探索发展路径与机会

在教育的广阔天地中&#xff0c;每一个孩子都应享有平等的学习机会和发展空间&#xff0c;孤独症&#xff08;自闭症&#xff09;儿童也不例外。星贝育园康复中心&#xff0c;作为全国规模较大的广泛性发育障碍全托寄宿制儿童康复训练机构&#xff0c;一直在探索和实践孤独症孩…

GAN的应用

5、GAN的应用 ​ GANs是一个强大的生成模型&#xff0c;它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布&#xff0c;也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…

分治算法——优选算法

本章我们要学习的是分治算法&#xff0c;顾名思义就是分而治之&#xff0c;把大问题分为多个相同的子问题进行处理&#xff0c;其中我们熟知的快速排序和归并排序用的就是分治算法&#xff0c;所以我们需要重新回顾一下这两个排序。 一、快速排序&#xff08;三路划分&#xf…

解决el-table表格数据量过大导致页面卡顿问题 又名《umy-ui---虚拟表格仅渲染可视区域dom的神》

后台管理系统的某个页面需要展示多个列表 数据量过多 页面渲染dom卡顿 经调研发现两个组件 pl-table和umy-ui &#xff08;也就是u-table&#xff09; 最终决定使用umy-ui 它是专门基于 Vue 2.0 的桌面端组件库 流畅渲染表格万级数据 而且他是对element-ui的表格做了二次优化…

单元测试概述入门

引入 什么是测试&#xff1f;测试的阶段划分&#xff1f; 测试方法有哪些&#xff1f; 1.什么是单元测试&#xff1f; 单元测试&#xff1a;就是针对最小的功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其正确性进行测试。 2.为什么要引入单元测试&#x…

Xcode 正则表达式实现查找替换

在软件开发过程中&#xff0c;查找和替换文本是一项常见的任务。正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的工具&#xff0c;可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具&#xff0c;提供了对正则表达式的支持。本…

基于微信小程序的电影交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

全网首发:编译libssh,产生类似undefined reference to `EVP_aes_256_ctr@OPENSSL_1_1_0‘的大量错误

具体错误 前面和后面的&#xff1a; /opt/linux/x86-arm/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: warning: libcrypto.so.1.1, needed by ../lib/libssh.so.4.10.1, not found (try using -rpath or -rpat…