1. 程式人生 > >Session監聽線上統計人數,簡單的單點登入

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;  
    }  

}