通过监听器实现在线人数统计

本文主要介绍通过servlet的监听器监听会话的创建、销毁、登录信息会话变量的设置,用于实现在线用户统计。


package com.chinasofti.ordersys.listeners;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.chinasofti.ordersys.vo.UserInfo;


public class OrderSysListener implements HttpSessionListener,
		HttpSessionAttributeListener {

	/**
	 * 存放所有已经登陆用户信息的Hashtable,键为用户sessionID,值为用户详细信息
	 * */
	public static Hashtable<String, UserInfo> sessions = new Hashtable<String, UserInfo>();
	/**
	 * 保存在线会话数的变量
	 * */
	public static int onlineSessions = 0;

	/**
	 * 获取在线服务员列表的方法
	 * 
	 * @return 当前在线的所有用户列表信息
	 * */
	public static ArrayList<UserInfo> getOnlineUsers() {
		// 获取所有在线用户的sessionID
		Set<String> sessionIds = sessions.keySet();
		// 获取在线用户ID的迭代器
		Iterator<String> sessionIdIt = sessionIds.iterator();
		// 创建结果集合
		ArrayList<UserInfo> list = new ArrayList<UserInfo>();
		// 迭代在线用户ID
		while (sessionIdIt.hasNext()) {
			// 获取该sessionID对应的用户信息
			UserInfo info = sessions.get(sessionIdIt.next());
			// 判定角色信息是否符合要求
			if (info.getRoleId() == roleId) {
				// 如果角色信息和给定信息一致,则将该用户加入结果列表
				list.add(info);
			}
		}
		// 返回结果列表
		return list;
	}


	/**
	 * 当session中添加属性时的监听器回调方法
	 * 
	 * @param arg0
	 *            监听器事件信息,可以获取添加属性的session\添加的属性名\添加的属性值等信息
	 * */
	@Override
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		// 如果添加的属性名是USER_INFO,则说明有一个用户登录了
		if (arg0.getName().equals("USER_INFO")) {
			// 将该用户信息添加到在线用户列表中
			sessions.put(arg0.getSession().getId(), (UserInfo) arg0.getValue());
		}
	}

	/**
	 * 当session中移出属性时的监听器回调方法
	 * 
	 * @param arg0
	 *            监听器事件信息,可以获取移出属性的session\移出的属性名\移出的属性值等信息
	 * */
	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		// 如果移出的属性名是USER_INFO,则说明有一个用户注销了
		if (arg0.getName().equals("USER_INFO")) {
			// 从在线用户列表中将该用户信息移出
			sessions.remove(arg0.getSession().getId());
		}

	}

	/**
	 * 当session中属性值被替换时的监听器回调方法
	 * 
	 * @param arg0
	 *            监听器事件信息,可以获取替换属性的session\替换的属性名\替换的属性值等信息
	 * */
	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		// 如果替换的属性名是USER_INFO,则说明有一个用户变更登录身份了
		if (arg0.getName().equals("USER_INFO")) {
			// 更新当前用户的登录信息
			sessions.put(arg0.getSession().getId(), (UserInfo) arg0.getValue());
		}

	}

	/**
	 * 当创建Session时的监听器回调方法
	 * 
	 * @param arg0
	 *            监听器事件信息,可以获取创建的session信息
	 * */
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		// 在线会话数增加
		onlineSessions++;
	}

	/**
	 * 当销毁Session时的监听器回调方法
	 * 
	 * @param arg0
	 *            监听器事件信息,可以获取销毁的session信息
	 * */
	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		// 在线会话数减少
		onlineSessions--;
		// 如果被销毁的时候已经登录的用户
		if (arg0.getSession().getAttribute("USER_INFO") != null) {
			// 从在线用户列表中将该用户信息移出
			sessions.remove(arg0.getSession().getId());
		}
	}

}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值