使用监听器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);//以秒为单位
下一篇: 日常使用Git分支创建、删除、合并
推荐阅读