HTTP协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。 不过可以通过统计session有多少来估计在线人数。
一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。
如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。
所以可以通过统计有多少session被保留来估计当前在线人数。
一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。
如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。
所以可以通过统计有多少session被保留来估计当前在线人数。
- 编写 OnlineNumberListener
OnlineNumberListener 实现接口HttpSessionListener
当创建一个session的时候,就把数字+1,并且放在application里。
就是这就是jsp里的applicationServletContext application = e.getSession().getServletContext();
注: 第一次从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("一位用户离线"); } }
- 配置web.xml
配置 listener.OnlineNumberListener
<listener> <listener-class>listener.OnlineNumberListener</listener-class> </listener>
- checkOnlineNumber.jsp
通过EL表达式,直接获取application中的值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> 当前 在线人数 : ${online_number}
- 测试
访问网页
注: 在重启tomcat测试之前, 要删除D:\tomcat\work\Catalina\localhost\_\SESSIONS.ser 这个文件。 这个文件是tomcat存放以前的session的,为了观察到创建session的活动,需要tomcat重启之前把以前的session都清除掉,才能观察到新创建session的活动http://127.0.0.1/checkOnlineNumber.jsp