SpringBoot监听器的使用方法

server/2025/1/15 0:51:44/

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

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

java">@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获取在线用户数量,代码如下:

java">@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统计网站访问次数,代码如下:

java">@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"));}
}

自定义监听方式

定义监听事件

java">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;}
}

定义监听器

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

发布事件

java">@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.ppmy.cn/server/158115.html

相关文章

用 Python 从零开始创建神经网络(十九):真实数据集

真实数据集 引言数据准备数据加载数据预处理数据洗牌批次&#xff08;Batches&#xff09;训练&#xff08;Training&#xff09;到目前为止的全部代码&#xff1a; 引言 在实践中&#xff0c;深度学习通常涉及庞大的数据集&#xff08;通常以TB甚至更多为单位&#xff09;&am…

【学习笔记】理解深度学习和机器学习的数学基础:数值计算

深度学习作为人工智能领域的一个重要分支&#xff0c;其算法的实现和优化离不开数值计算。数值计算在深度学习中扮演着至关重要的角色&#xff0c;它涉及到如何在计算机上高效、准确地解决数学问题。本文将介绍深度学习中数值计算的一些关键概念和挑战&#xff0c;以及如何应对…

git - 用SSH方式迁出远端git库

文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注githubEND git - 用SSH方式迁出远端git库 概述 最近一段时间&#xff0c;在网络没问题的情况下&#xff0c;用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端…

若依框架--数据字典设计使用和前后端代码分析

RY的数据字典管理: 字典管理是用来维护数据类型的数据&#xff0c;如下拉框、单选按钮、复选框、树选择的数据&#xff0c;方便系统管理员维护。减少对后端的访问&#xff0c;原来的下拉菜单点击一下就需要对后端进行访问&#xff0c;现在通过数据字典减少了对后端的访问。 如…

性能测试工具Jmeter中的FTP脚本开发

FTP文件传输协议是TCP/IP协议组织中的常用协议之一&#xff0c;主要用在internet上双向传输文件。FTP协议具有客户端和服务器端两个部分组成部分&#xff0c;具有上传与下载两种功能。Jmeter也提供了FTP请求的测试支持&#xff0c;实现了上传和下载功能测试。 对于上图的FTP请求…

小白项目部署:anaconda环境+pycharm+yolov5(虚拟机环境)

创建虚拟环境&#xff1a;conda create --name my_yolo 激活环境命令&#xff1a;activate my_yolo 3.打开anaconnda软件&#xff0c;选择my_yolo环境 4.点击右下角&#xff0c;更换pycharm虚拟环境my_yolo 5.选择Conda环境&#xff0c;选择my_yolo 6.安装解释器成功 7.…

HTTP 入门:认识网络通信基础

一、引言&#xff1a;HTTP 在网络世界的基石地位 在当今数字化的时代&#xff0c;网络通信如同空气一般无处不在&#xff0c;而 HTTP 协议则是网络世界中最为重要的基石之一。无论是浏览网页、使用手机 APP&#xff0c;还是进行各种网络数据交互&#xff0c;HTTP 都在背后默默…

C++ Primer Notes(4): 变量初始化和作用域

这篇笔记是关于 C Primer 的 2.2 节 Variables 的记录和思考。 1. 变量是什么 变量是有名字的对象&#xff1a; variables are named objects. 那么什么是对象&#xff08;object&#xff09;&#xff1f; 一块具有类型的内存&#xff0c;称为对象。 而没有名字的对象&#…