0

0

如何在Java中实现网站在线人数统计_ServletContextListener监听器全局变量累加

P粉602998670

P粉602998670

发布时间:2026-03-17 14:06:34

|

158人浏览过

|

来源于php中文网

原创

应使用 AtomicInteger 存入 ServletContext:contextInitialized 中 setAttribute("onlineCount", new AtomicInteger(0));sessionCreated 增、sessionDestroyed 减(须判空);前端通过受控接口读取,集群下不适用。

如何在java中实现网站在线人数统计_servletcontextlistener监听器全局变量累加

ServletContextListener 初始化时怎么安全设置在线人数计数器

不能直接在 contextInitialized 里 new 一个普通 int 或 Integer 当全局计数器——它不是线程安全的,多个请求并发进来会丢数。必须用原子类或加锁机制。

推荐用 AtomicInteger 存到 ServletContext 中,这是最轻量且线程安全的做法:

public void contextInitialized(ServletContextEvent sce) {
    ServletContext ctx = sce.getServletContext();
    ctx.setAttribute("onlineCount", new AtomicInteger(0));
}
  • AtomicIntegersynchronized 块更高效,避免锁竞争
  • 别存 intInteger,它们不可变,每次 ++ 都是新对象,setAttribute 不会自动更新上下文里的值
  • 不要在监听器里启动定时任务或开线程去“刷新”这个值——它只该被 session 生命周期驱动

sessionCreated 和 sessionDestroyed 里怎么正确增减计数

关键不是“加1减1”,而是确保每次 session 创建/销毁都真实反映用户连接状态。常见错误是:监听器没注册、session 超时未触发销毁、浏览器关掉但没显式登出导致计数虚高。

实操要点:

立即学习Java免费学习笔记(深入)”;

ProcessOn
ProcessOn

免费在线流程图思维导图,专业强大的作图工具,支持多人实时在线协作

下载
  • sessionCreated 中调用 ((AtomicInteger) ctx.getAttribute("onlineCount")).incrementAndGet()
  • sessionDestroyed 中调用 decrementAndGet(),**必须判空**,防止应用重启后 context 里没初始化就进销毁逻辑
  • 确保 web.xml 或注解正确注册监听器:@WebListener<listener><listener-class>xxx</listener-class></listener>
  • 注意:session 默认 30 分钟超时,这段时间内用户关闭浏览器,服务端仍会计为“在线”,这是 HTTP 协议限制,无法靠监听器解决

前端怎么安全读取当前在线人数而不暴露 ServletContext

不能让前端直接访问 ServletContext,也不能把计数器塞进静态资源里。必须走一个受控的 HTTP 接口。

推荐做法是写一个简单 servlet 或 controller(比如 Spring MVC 的 @RestController):

@GetMapping("/api/online")
public int getOnlineCount(HttpServletResponse response) {
    AtomicInteger count = (AtomicInteger) request.getServletContext()
        .getAttribute("onlineCount");
    return count != null ? count.get() : 0;
}
  • 返回纯数字或 JSON,别带 HTML 模板——避免 XSS 风险
  • 如果用了 Spring Boot,注意 ServletContext 在非 Web 环境(如单元测试)里是 null,要加空判断
  • 别用 request.getSession().getServletContext() 多次获取,直接从 request 对象拿更稳妥

为什么有时候统计数比实际多,甚至负数

负数基本只有一种可能:decrementAndGet() 被调了比 incrementAndGet() 更多次。多出来的正数则多数源于 session 生命周期误判。

  • 典型场景:用户开多个标签页,每个标签页触发一次 session 创建(尤其用了 isNew() 判断不当的登录逻辑)
  • 开发环境热部署(如 Tomcat reload)会导致 contextDestroyed 触发,但旧 session 还没清完,新 context 又初始化计数器为 0,老 session 销毁时去减一个不存在的计数器,就可能空指针或错减
  • 集群部署下,ServletContext 是单机的,这个方案天然不支持分布式——别试图用 Redis 替换 AtomicInteger 后还叫它“ServletContextListener 方案”
  • 如果看到负数,立刻检查 sessionDestroyed 是否在 count 为 0 时还执行了 decrementAndGet()

真正的难点从来不在“怎么加减”,而在于你是否清楚每个 session 事件背后的容器行为、网络断连表现和部署拓扑约束。漏掉任意一环,数字就只是个幻觉。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

99

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

159

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

245

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号