基于Listener实现在线人数监测的简单案例

news2024/11/15 23:37:16

一、需求

只要有用户登录到服务器,就记录在线用户+1。

二、使用到的Listner介绍

1、HttpSessionListener 监听器

  • 当一个HttpSession刚被创建或者失效(invalidate)的时候,将会通知HttpSessionListener监听器。

    方法声明功能介绍
    void sessionCreated(HttpSessionEvent se)当一个HttpSession对象被创建时会调用这个方法
    void sessionDestroyed(HttpSessionEvent se)当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法
  • 方法声明功能介绍
    void sessionCreated(HttpSessionEvent se)当一个HttpSession对象被创建时会调用这个方法
    void sessionDestroyed(HttpSessionEvent se)当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法

2、ServletContextListener 监听器

  • 在ServletContext创建和关闭时都会通知ServletContextListener监听器。

    方法声明功能介绍
    void contextInitialized(ServletContextEvent sce)当ServletContext创建的时候,将会调用这个方法
    void contextDestroyed(ServletContextEvent sce)当ServletContext销毁的时候(例如关闭应用服务器 或者重新加载应用),将会调用这个方法

三、代码实现

1、代码实现

  1. OnlineUser

    package com.example.online_user;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    public class OnlineUser implements HttpSessionListener, ServletContextListener {
        private ServletContext servletContext = null;
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            servletContext = sce.getServletContext();
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            servletContext = null;
        }
    
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            System.out.println("新用户上线~");
            Object count = servletContext.getAttribute("count");
            if(count == null){
                servletContext.setAttribute("count", 1);
            }else {
                int userCount = (int) count + 1;
                servletContext.setAttribute("count", userCount);
            }
            System.out.println("当前在线人数" + servletContext.getAttribute("count"));
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            System.out.println("用户下线!");
            servletContext.setAttribute("count", (int)(servletContext.getAttribute("count")) - 1);
        }
    }
    
    

    通过这样的设计,每当有用户上线或下线时,都能够动态地更新并存储在 ServletContext 中的在线用户总数,并输出当前在线用户数量。

  2. 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">
        
        <listener>
            <listener-class>com.example.online_user.OnlineUser</listener-class>
        </listener>
    </web-app>
    

2、测试结果

在这里插入图片描述

换个浏览器再访问:
在这里插入图片描述

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

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

相关文章

Vscode设置git账户密码(不需要每次都输入)

在Vscode提交项目代码或者拉取代码的时候&#xff0c;如果每次都需要输入git的账户密码&#xff0c;那么就在终端输入&#xff1a; git config --global credential.helper store 命令 然后执行git pull 提示输入用户密码后&#xff0c;就会缓存&#xff1b; ※注&#xff1a;如…

没有货源是不是就没办法在家做抖店?打包发货怎么完成?解答如下

我是王路飞。 有人问了我一个问题&#xff1a;无货源模式的抖店&#xff0c;自己一个人在家里做不了是吧&#xff1f;毕竟打包发货这些问题怎么解决呢&#xff1f; 店铺要是发货不及时被平台罚款怎么办&#xff1f;产品有质量问题怎么解决呢&#xff1f;店铺一直不出单怎么办…

Unity中URP下深度图的线性转化

文章目录 前言一、_ZBufferParams参数有两组值二、LinearEyeDepth1、使用2、Unity源码推导&#xff1a;3、使用矩阵推导&#xff1a; 三、Linear01Depth1、使用2、Unity源码推导3、数学推导&#xff1a; 前言 在之前的文章中&#xff0c;我们实现了对深度图的使用。因为&#…

阿里云弹性网络接口技术的容器网络基础教程

基于容器的虚拟化是一种虚拟化技术。与虚拟机 &#xff08;VM&#xff09; 相比&#xff0c;容器更轻量级&#xff0c;部署更方便。Docker是目前主流的容器引擎&#xff0c;支持Linux、Windows等平台&#xff0c;以及Kubernetes&#xff08;K8S&#xff09;、Swarm、Rocket&…

奇偶链表00

题目链接 奇偶链表 题目描述 注意点 在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题偶数组和奇数组内部的相对顺序应该与输入时保持一致 解答思路 奇数组的头节点是head&#xff0c;偶数组的头节点是head.next&#xff0c;关键是要改变每个节点的next指针及…

[ArkUI开发技巧] 应用的全屏式沉浸适配

引言 在开发应用的过程中&#xff0c;为了使用户聚焦在应用本身&#xff0c;最好对应用进行沉浸适配。先前有一种适配方法&#xff0c;将SystemBarProperties设置成应用页面顶部和底部的颜色&#xff0c;但是这种方法在切换页面的过程中过渡十分僵硬&#xff0c;且应用在小窗模…

数据结构实验3:顺序表的基本操作

目录 一、实验目的 二、实验原理 1. 连续存储空间 2. 元素访问 3. 固定大小 4. 容量管理 5. 动态顺序表 6. 顺序表的插入 7. 顺序表的删除 8. 顺序表的应用 三、实验内容 问题描述 代码 截图 分析 一、实验目的 1、 熟练掌握顺序表结构体的实现。 2、 熟练掌握…

记录汇川:ITP与Autoshop进行仿真连接

1、定义如下程序&#xff1a; 2、ITP新建工程&#xff1a; 3、依次选择&#xff0c;最后修改IP 4、定义两个变量 5、拖一个按钮和一个圈出来&#xff0c;地址绑定&#xff1a;M1 6、地址绑定&#xff1a;Y1 7、PLC启动仿真 8、ITP启动在线模拟器 9、即可实现模拟仿真

Redis 配置(二)

目录 redis 配置 Redis 主从复制 主从复制的作用 主从复制流程 搭建Redis 主从复制 Redis 哨兵模式 哨兵模式的作用 哨兵结构 故障转移机制 主节点的选举 搭建Redis 哨兵模式 Redis 群集模式 集群的作用 Redis集群的数据分片 Redis集群的主从复制模型 搭建R…

拓数派加入 OpenCloudOS 操作系统开源社区,作为成员单位参与社区共建

近日&#xff0c;拓数派签署 CLA(Contributor License Agreement 贡献者许可协议)&#xff0c;正式加入 OpenCloudOS 操作系统开源社区。 拓数派&#xff08;英文名称“OpenPie”&#xff09;是国内基础数据计算领域的高科技创新企业。作为国内云上数据库和数据计算领域的引领者…

CentOS7部署GitLab-ce-16.7.0-ce.0.el7

文章目录 下载地址上传服务器安装访问配置external_url修改防火墙端口开放 重新加载配置访问GitLab出现502访问错误继续访问gitlab账户和密码修改GitLab常用命令 下载地址 gitlab 下载地址 上传服务器 scp -r C:\Users\xxx.xxxx\Downloads\gitlab-ce-16.7.0-ce.0.el7.x86_64…

黑马苍穹外卖学习Day3

目录 公共字段自动填充问题分析实现思路代码实现 新增菜品需求分析和设计接口设计代码开发开发文件上传接口功能开发 菜品分页查询需求分析和设计代码开发 菜品删除功能需求分析与设计代码实现代码优化 修改菜品需求分析和设计代码实现 公共字段自动填充 问题分析 员工表和分…

因为相信,所以简单,因为简单,所以坚持

因为相信&#xff0c;所以简单&#xff1b;因为简单&#xff0c;所以坚持。今天&#xff0c;我有幸受邀参加了九龙珠集团2023年以《蓄力生长》为主题的年会。在这里&#xff0c;我深刻感受到这两句话不仅是九龙珠集团成长的缩影&#xff0c;也是其不断前进的动力。在企业的经营…

选择智能酒精壁炉,拥抱环保与未来生活

保护环境一直是我们共同的责任和目标&#xff0c;而在这场争取保护环境的斗争中&#xff0c;选择使用智能酒精壁炉而非传统壁炉成为了一种积极的行动。这不仅仅是对环境负责&#xff0c;更是对我们自身生活质量的关照。 传统壁炉与智能酒精壁炉的对比 传统壁炉常常以木柴、煤炭…

如何创建VPC并配置安全组以保护您的阿里云服务器

将您的基础架构放在云上意味着您可以接触到全球的许多人。但是&#xff0c;这也意味着不怀好意的人可以访问您的服务。保护您的云网络非常重要。阿里云提供虚拟专用网络 &#xff08;VPC&#xff09;&#xff0c;这是一个安全隔离的私有云&#xff0c;将您的弹性计算服务 &…

算法第十一天-组合总和Ⅳ

组合总和Ⅳ 题目要求 解题思路 来自[负雪明烛] 题目有个明显的提示&#xff1a;求组合的个数&#xff0c;而不是每个组合。如果是要求出每个组合&#xff0c;那么必须使用回溯法&#xff0c;保存所有路径。但是如果是组合个数&#xff0c;一般都应该想到[动态规划]的解法。 直…

vite-admin框架搭建,ESLint + Prettier 语法检测和代码格式化

vite-admin框架搭建&#xff0c;ESLint Prettier 语法检测和代码格式化 1. 环境和工具2. 项目初始化3. 安装插件1. 安装ESLint1.1 安装插件1.2 初始化ESLint 2. 安装Prettier2.1 安装插件2.2 配置Prettier 3. vscode 安装插件及配置3.1 安装插件 ESLint 和 Prettier - Code fo…

许战海战略文库|加加食品:错过窗口期的“酱油第一股”如何逆袭

加加食品集团股份有限公司成立于1996年&#xff0c;是一家综合研发、生产和营销的大型调味品上市公司。该公司在2012年1月6日成功上市&#xff0c;被尊称为“中国酱油第一股”。然而&#xff0c;在近年来&#xff0c;该公司经历了重大挑战&#xff0c;包括持续的业绩下滑、低迷…

Docker简述与基础部署详解

docker官网&#xff1a;https://www.docker.com docker中文库:https://www.docker.org.cn/ Docker是一种开源的容器化平台&#xff0c;用于轻松打包、交付和运行应用程序。Docker的主要优势在于它提供了一种轻量级、可移植、自包含的容器化技术&#xff0c;使得应用程序及其所…

基于uniapp封装的card容器 带左右侧两侧标题内容区域

代码 <template><view class"card"><div class"x_flex_header"><div><title v-if"title ! " class"title" :title"title" :num"num"></title></div><div><s…