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

使用监听器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);//以秒为单位

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现在线用户统计,可以使用Listener监听器来监控用户的会话(session)状态。具体实现步骤如下: 1. 创建一个实现了HttpSessionListener接口监听器类,例如OnlineUserListener。 2. 在该类中实现sessionCreated方法和sessionDestroyed方法。 3. 在sessionCreated方法中,获取当前创建的会话(session),并将该会话添加到一个集合中,表示该用户已经在线。 4. 在sessionDestroyed方法中,获取当前销毁的会话(session),并将该会话从集合中移除,表示该用户已经下线。 5. 在web.xml中配置该监听器。 6. 在需要统计在线用户数的地方,可以通过访问OnlineUserListener中的集合来获取在线用户数。 示例代码: // OnlineUserListener.java import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import java.util.ArrayList; import java.util.List; public class OnlineUserListener implements HttpSessionListener { // 存储在线用户的集合 private static List<HttpSession> sessions = new ArrayList<HttpSession>(); // session创建时调用 public void sessionCreated(HttpSessionEvent se) { // 将创建的session添加到集合中 HttpSession session = se.getSession(); sessions.add(session); } // session销毁时调用 public void sessionDestroyed(HttpSessionEvent se) { // 将销毁的session从集合中移除 HttpSession session = se.getSession(); sessions.remove(session); } // 获取在线用户数 public static int getOnlineUserCount() { return sessions.size(); } } // web.xml中配置OnlineUserListener <listener> <listener-class>OnlineUserListener</listener-class> </listener> // 在需要统计在线用户数的地方调用OnlineUserListener.getOnlineUserCount()方法 int onlineUserCount = OnlineUserListener.getOnlineUserCount();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值