Session監聽線上統計人數,簡單的單點登入
阿新 • • 發佈:2019-01-10
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; } }