欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用监听器HttpSessionListener接口统计在线人数

程序员文章站 2024-03-20 10:38:12
...

使用监听器HttpSessionListener接口统计在线人数 

        当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象,并触发 HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发 HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。

  • 关键代码

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 使用监听器HttpSessionListener接口统计在线人数
 * @author anneli
 * @date 2019年10月21日 下午2:52:13 
 *
 */
@WebListener
public class listener implements HttpSessionListener {
	/* Session创建事件 */
	public void sessionCreated(HttpSessionEvent se) {
		ServletContext ctx = se.getSession().getServletContext();
		Integer num = (Integer) ctx.getAttribute("num");
		if (num == null) {
			num = new Integer(1);
		} else {
			int count = num.intValue();
			num = new Integer(count + 1);
		}
		ctx.setAttribute("num", num);
		System.out.println("在线人数:"+ctx.getAttribute("num"));
	}

	/* Session失效事件 */
	public void sessionDestroyed(HttpSessionEvent se) {
		ServletContext ctx = se.getSession().getServletContext();
		Integer num = (Integer) ctx.getAttribute("num");
		if (num == null) {
			num = new Integer(0);
		} else {
			int count = num.intValue();
			num = new Integer(count - 1);
		}
		ctx.setAttribute("num", num);
		System.out.println("在线人数:"+ctx.getAttribute("num"));
	}
}
  •  存在问题

当浏览器关闭时,session并未销毁,所以sessionDestroyed方法并未执行。原因是浏览器关闭后,session的超时时间未到,默认tomcat设置的session超时时间为30min,因此需要修改超时时间。

  • 可以在web.xml里设置 :
  <session-config>
      <session-timeout>3</session-timeout>
  </session-config>
  • 也可以在代码里设置:
session.setMaxInactiveInterval(30*60);//以秒为单位