Session监听在线统计人数,简单的单点登录

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OaSessionListener implements HttpSessionListener {

	//保存sessionId和UserName的映射
	private static HashMap hUserName=new HashMap();
	
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		HttpSession session = arg0.getSession();
		ServletContext application = session.getServletContext();

		//把用户名放入在线列表,在application范围有一个List集保存所有的Session
		List onlineUserList = (List) application.getAttribute("onlineUserList");

		// 第一次使用前,需要初始化
		if (onlineUserList == null) {
			onlineUserList = new ArrayList();
			application.setAttribute("onlineUserList", onlineUserList);
		}
		// 新创建的session均添加到List集中
		onlineUserList.add(onlineUserList);
		System.out.println("当前在线人数:" + onlineUserList.size() + "人");
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		HttpSession session = arg0.getSession();
		ServletContext application = session.getServletContext();
		List onlineUserList = (List) application.getAttribute("onlineUserList");
		 //销毁的session均从List中移除
		onlineUserList.remove(onlineUserList);
		System.out.println("用户退出或登录超时之后用户在线人数:" + onlineUserList.size() + "人");
	}
	
	/**
	 * TODO	用于判断用户是否已经登录以及相应的处理方法
	 * @author Palm
	 * @date 2016年7月27日
	 * @param session	用户登录时的session
	 * @param sUserName	登录的用户名称
	 * @return
	 */
	public static boolean isAlreadyEnter(HttpSession session,String sUserName){
		boolean flag=false;
		//如果该用户已经登录过,则使上次登陆的用户掉线
		if(hUserName.containsValue(sUserName)){
			flag=true;
			//遍历原来的hUserName,删除原用户名对应的SessionID(即删除原来的sessionID和userName)
			Iterator iter=hUserName.entrySet().iterator();
			while(iter.hasNext()){
				Map.Entry entry=(Map.Entry)iter.next();
				Object key = entry.getKey();
				Object value = entry.getValue();
				if(value.equals(sUserName)){
					System.out.println("hUserName = "+value);
					hUserName.remove(key);
				}
			}
			//添加现在的SessionID和userName
			hUserName.put(session.getId(), sUserName);
			System.out.println("hUserName = "+hUserName);
		}else{//如果用户没有登录过,直接添加到现在的SessionID和userName
			flag=false;
			hUserName.put(session.getId(), sUserName);
			System.out.println("hUserName ="+hUserName);
		}
		return flag;
	}
     /** 
     * isOnline-用于判断用户是否在线 
     *  
     * @param session 
     *            HttpSession-登录的用户名称 
     * @return boolean-该用户是否在线的标志 
     */  
    public static boolean isOnline(HttpSession session) {  
        boolean flag = true;  
        if (hUserName.containsKey(session.getId())) {  
            flag = true;  
        } else {  
            flag = false;  
        }  
        return flag;  
    }  

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值