how2j.cn


工具版本兼容问题
HTTP协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。 不过可以通过统计session有多少来估计在线人数。

一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。

如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。

所以可以通过统计有多少session被保留来估计当前在线人数。


步骤 1 : 编写 OnlineNumberListener   
步骤 2 : 配置web.xml   
步骤 3 : checkOnlineNumber.jsp   
步骤 4 : 测试   

步骤 1 :

编写 OnlineNumberListener

edit
OnlineNumberListener 实现接口HttpSessionListener

当创建一个session的时候,就把数字+1,并且放在application里。
ServletContext application = e.getSession().getServletContext();

这就是jsp里的application

注: 第一次从application里取数据的时候,是空的,要设置为0。

当销毁一个session的时候,把这个数字-1
package listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class OnlineNumberListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent e) { ServletContext application = e.getSession().getServletContext(); Integer online_number = (Integer) application.getAttribute("online_number"); if (null == online_number) online_number = 0; online_number++; application.setAttribute("online_number", online_number); System.out.println("新增一位在线用户"); } @Override public void sessionDestroyed(HttpSessionEvent e) { ServletContext application = e.getSession().getServletContext(); Integer online_number = (Integer) application.getAttribute("online_number"); if(null==online_number){ online_number = 0; } else online_number--; application.setAttribute("online_number", online_number); System.out.println("一位用户离线"); } }
配置 listener.OnlineNumberListener
<listener> <listener-class>listener.OnlineNumberListener</listener-class> </listener>
	<listener>
		<listener-class>listener.OnlineNumberListener</listener-class>
	</listener>	
步骤 3 :

checkOnlineNumber.jsp

edit
通过EL表达式,直接获取application中的值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> 当前 在线人数 : ${online_number}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
 
 当前 在线人数 : ${online_number}
访问网页
http://127.0.0.1/checkOnlineNumber.jsp


注: 在重启tomcat测试之前, 要删除D:\tomcat\work\Catalina\localhost\_\SESSIONS.ser 这个文件。 这个文件是tomcat存放以前的session的,为了观察到创建session的活动,需要tomcat重启之前把以前的session都清除掉,才能观察到新创建session的活动
测试


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2021-06-21 在Listener这个模块中访问的所有jsp页面都会自动跳转到登录页面(http://127.0.0.1/login.html)
byxdbyj玉

这是怎么回事呢?




2 个答案

四方1
答案时间:2023-08-08
我也蚌埠住了哈哈哈 上一章刚学的过滤器,马上就忘了哈哈哈 标准的狗熊掰棒子

王羲之
答案时间:2021-07-03
服了你了,这个是你学filter自己写的东西啊,Filter登陆验证,回去看看



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2021-04-09 请问,我的online_number为什么会是负数?
Kuluu

似乎是session创建了一次会被销毁两次。求解!







回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-11-17 ServletContext 如何保证线程安全?
2019-08-01 使用IDEA完成online number时
2019-01-05 这里的Integer是不是换成原子性的AtomicInteger比较好


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 10 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-Listener-统计在线人数 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图