how2j.cn


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

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

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

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

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

步骤 1 :

编写 OnlineNumberListener

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("一位用户离线"); } }
步骤 2 :

配置web.xml

配置 listener.OnlineNumberListener
<listener> <listener-class>listener.OnlineNumberListener</listener-class> </listener>
	<listener>
		<listener-class>listener.OnlineNumberListener</listener-class>
	</listener>	
步骤 3 :

checkOnlineNumber.jsp

通过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}
步骤 4 :

测试

访问网页
http://127.0.0.1/checkOnlineNumber.jsp


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


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


问答区域    
2018-08-15 方法名一定要用sessionCreated 吗,用了sessionCreate就不行。。。。
linuxzzz
方法名一定要用sessionCreated 吗,用了sessionCreate就不行。。。。




1 个答案

爱好学习的星星 答案时间:2018-09-09
它实现了接口HttpSessionListener,重写了它的方法sessionCreated




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-06-08 为什么我的显示在线用户后面没显示数字
秋刀鱼殿下



为什么我的显示在线用户后面没显示数字

							

							


2 个答案

Little_Monkey 答案时间:2018-07-05
拼写出错了把

探索 答案时间:2018-06-09
代码贴出来好吗? 可能你没有输出Session?




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-01-22 我需要怎么操作用户才会创建 session 对象
2018-01-21 站长,在线人数如何实际测试?
2018-01-02 站长您好,想请教一下为什么程序首次运行得到的 在线人数就是 3?,应该为 1 才对吧?
2017-10-24 获取在线人数问题,使用el表达式可以取值,另一种不行?
2017-09-12 jsp页面不显示
2017-08-16 我得到的在线人数问题
2017-04-17 Integer 换成 int 可以不?
2017-03-14 online_number在哪设置的?




提问之前请登陆
关于 J2EE-Listener-统计在线人数 的提问

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

上传截图