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-01-22 我需要怎么操作用户才会创建 session 对象
奋斗的瞄
老师,我需要怎么操作才能创建session对象啊,启动web项目后,在浏览器打开一个.jsp,就会创建一个,再打开别的.jsp就不会继续创建了,所以我想知道,session什么时候创建,什么时候销毁。。。 另外,还有一个神奇的地方,我换个浏览器打开.jsp,会创建session。




2 个答案

monkey12 答案时间:2018-02-27
另外,还有一个神奇的地方,我换个浏览器打开.jsp,会创建session。 ---------------------------------------- Session对应的中文翻译是会话。 会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。 来源在此:http://how2j.cn/k/jsp/jsp-session/583.html ---------------------------------------- 个人猜测: 一个session,完成ta的两个对象是一个browser对应一个server server因为你是在本地测试,是同一个server,称为serverLocal 你换浏览器浏览网站的动作,等同于在browserA+serverLocal=sessionA的基础上,创建了新的browserB+serverLocal=sessionB 当你不断的用新浏览器浏览,还是会不断的创建新的session的

nighthawk 答案时间:2018-02-27
监听Session那节,有写: 随意访问任意页面 如果是第一次访问,都会触发session创建,后续访问不会触发session的创建 关闭浏览器,再访问,也会触发session的创建。 但是有的浏览器,即便是关闭了,下一次打开,也会发送以前sessionid到服务器,这样服务器就不会创建新的session。 请参考 session原理示意图 session的销毁不易观察到,一般说来服务器会设置session存活时间为30分钟。所以需要等待才能观察到销毁 http://how2j.cn/k/listener/listener-session/606.html




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




2018-01-21 站长,在线人数如何实际测试?
NEAR5
设置了路由器的虚拟服务器,也不行,端口没冲突,不知道哪里出问题了 但是我是用手机测的...








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




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
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图