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