📄 onlinecounterlistener.java
字号:
package com.dudu.moa.commons;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 通过监听session(包括attribute)设置和获取在线用户列表
*
* @author <a href="malito:denglq@wanwei.com.cn">邓利强</a>
*/
public class OnlineCounterListener implements HttpSessionAttributeListener, HttpSessionListener {
public void attributeAdded(HttpSessionBindingEvent event) {
// 当session属性中添加key为"___session_user_key"的时候,表示用户登录
// if (StringUtils.isNotBlank(event.getName()) &&
// Constants.SESSION_USER_KEY.equalsIgnoreCase(event.getName())) {
// SysUser sysUser = (SysUser)event.getSession().getAttribute(Constants.SESSION_USER_KEY);
// if (sysUser != null) {
// String orgId = sysUser.getOrgId();
// String userId = sysUser.getUserId();
// if (StringUtils.isBlank(userId)) log.warn("用户编号为空");
// if (StringUtils.isBlank(orgId)) log.warn("单位编号为空");
// SysOrg sysOrg = null;
// try {
// sysOrg = getSysOrg(sysUser.getOrgId());
// } catch (Exception e) {
// e.printStackTrace();
// }
// if (userMap.containsKey(userId)) {
// String oldSessionId = (String)((SysUser)userMap.get(userId)).getProperty("sessionId");
// if (!event.getSession().getId().equalsIgnoreCase(oldSessionId)) {
// log.info("【" + sysOrg.getOrgName() + "】的<" + sysUser.getUserName() + ">】重复登录");
// sessionMap.put(oldSessionId, Constants.LOGIN_OTHER_LOGED);
// sysUser.addProperty("sessionId", event.getSession().getId());
// userMap.put(userId, sysUser);
// sessionMap.put(event.getSession().getId(), Constants.LOGIN_NORMAL);
// }
// } else {
// if (orgMap.containsKey(orgId)) {
// Integer count = (Integer)orgMap.get(orgId);
// count++;
// orgMap.put(orgId, count);
// } else {
// orgMap.put(orgId, 1);
// }
// log.info("【" + sysOrg.getOrgName() + "】的<" + sysUser.getUserName() + ">登录系统");
// sysUser.addProperty("sessionId", event.getSession().getId());
// userMap.put(userId, sysUser);
// sessionMap.put(event.getSession().getId(), Constants.LOGIN_NORMAL);
// }
// log.info("【" + sysOrg.getOrgName() + "】的在线用户数为:" + orgMap.get(orgId));
// }
// }
//
// //当session属性中添加key为"__session_logout"时,表示用户离线
// if (StringUtils.isNotBlank(event.getName()) &&
// Constants.SESSION_LOGOUT.equalsIgnoreCase(event.getName())) {
// SysUser sysUser = (SysUser)event.getSession().getAttribute(Constants.SESSION_USER_KEY);
// if (sysUser != null) {
// String orgId = sysUser.getOrgId();
// String userId = sysUser.getUserId();
// if (StringUtils.isBlank(userId)) log.warn("用户编号为空");
// if (StringUtils.isBlank(orgId)) log.warn("单位编号为空");
// SysOrg sysOrg = null;
// try {
// sysOrg = getSysOrg(sysUser.getOrgId());
// } catch (Exception e) {
// e.printStackTrace();
// }
// deleteDocByUserId(userId);// 删除正文加锁标志
//
// if (userMap.containsKey(userId)) {
// userMap.remove(userId);
//
// if (orgMap.containsKey(orgId)) {
// Integer count = (Integer)orgMap.get(orgId);
// count--;
// orgMap.put(orgId, count);
// }
// }
//
// event.getSession().invalidate();
// log.info("【" + sysOrg.getOrgName() + "】的<" + sysUser.getUserName() + ">自行下线");
// log.info("【" + sysOrg.getOrgName() + "】的在线用户数为:" + orgMap.get(orgId));
// }
// }
//
// //文档加锁
// if (StringUtils.isNotBlank(event.getName()) && event.getName().indexOf("docLocked_") >=
// 0) {
// String docId = event.getName();
// SysUser sysUser = (SysUser)(event.getSession().getAttribute(docId));
// String userName = sysUser.getUserName();
// if(existDoc(docId)){
// log.debug("公文已被"+userName+"加锁!");
// }else{
// docLockedMap.put(docId, sysUser);
// }
// }
}
public void attributeReplaced(HttpSessionBindingEvent event) {
// 用户重新登录
// if (StringUtils.isNotBlank(event.getName()) &&
// Constants.SESSION_USER_KEY.equalsIgnoreCase(event.getName())) {
// SysUser sysUser = (SysUser)event.getSession().getAttribute(Constants.SESSION_USER_KEY);
// SysOrg sysOrg = null;
// try {
// sysOrg = getSysOrg(sysUser.getOrgId());
// } catch (Exception e) {
// e.printStackTrace();
// }
// log.info("【" + sysOrg.getOrgName() + "】的<" + sysUser.getUserName() + ">再次登录系统");
// log.info("【" + sysOrg.getOrgName() + "】的在线用户数为:" + orgMap.get(sysUser.getOrgId()));
// }
//
// //用户重复离线
// if (StringUtils.isNotBlank(event.getName()) &&
// Constants.SESSION_LOGOUT.equalsIgnoreCase(event.getName())) {
// event.getSession().removeAttribute(Constants.SESSION_LOGOUT);
// }
}
public void sessionCreated(HttpSessionEvent event) {
log.debug("session 被创建,id:" + event.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent event) {
// SysUser sysUser = (SysUser) event.getSession().getAttribute(Constants.SESSION_USER_KEY);
// if (sysUser != null) {
// SysOrg sysOrg = null;
// try {
// sysOrg = getSysOrg(sysUser.getOrgId());
// } catch (Exception e) {
// e.printStackTrace();
// }
// deleteDocByUserId(sysUser.getUserId());// 删除正文加锁标志
// if (userMap.containsKey(sysUser.getUserId())) {
// //得到当前被注销session中的用户实体中保存的sessionId
// String destoryedSessionId = (String)sysUser.getProperty("sessionId");
// //得到在线用户Map里的用户实体中保存的sessionId
// String currentSessionId =
// (String)((SysUser)userMap.get(sysUser.getUserId())).getProperty("sessionId");
// if (StringUtils.isNotBlank(destoryedSessionId) &&
// StringUtils.isNotBlank(currentSessionId)) {//保证两个sessionId都不为空
// //如果登录用户的sessionId等于注销session的用户sessionId
// //则从在线用户Map中清除该用户,并且而在线人数减1
// if (currentSessionId.equals(destoryedSessionId)) {
// userMap.remove(sysUser.getUserId());
// boolean test = false;
// if (orgMap.containsKey(sysUser.getOrgId())) {
// Integer count = (Integer)orgMap.get(sysUser.getOrgId());
// if (count != null) {
// test = true;
// int _count = count.intValue();
// _count--;
// orgMap.put(sysUser.getOrgId(), _count);
// }
// }
// if (!test) log.error("在线统计人数有bug!!!!!!!!!!!!!");
// }
// }
// }
//
// log.info("【" + sysOrg.getOrgName() + "】的<" + sysUser.getUserName() + ">在" +
// event.getSession().getAttribute(Constants.SESSION_LOGIN_IP) + "登录的状态被清空");
// log.info("【" + sysOrg.getOrgName() + "】的在线用户数为:" + orgMap.get(sysUser.getOrgId()));
// }
}
/**
* 根据单位id获取在线人数
*
* @param currentEnterId
* @return
*/
public static int getCount(String orgId) {
if (orgMap.containsKey(orgId)) {
Integer n = (Integer) orgMap.get(orgId);
return n.intValue();
} else {
return 0;
}
}
public static List getUserList(String orgId) {
List result = new ArrayList();
// SysUser sysUser = null;
// String userId = null;
// for (Iterator it = userMap.keySet().iterator(); it.hasNext();) {
// userId = (String)it.next();
// if (userId != null) {
// sysUser = (SysUser)userMap.get(userId);
// if (sysUser != null) {
// if (orgId.equals(sysUser.getOrgId())) {
// result.add(sysUser);
// }
// }
// }
// }
return result;
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
private transient final Log log = LogFactory.getLog(getClass());
/**
* 已登录用户
*/
private static Map userMap = new LinkedHashMap();
public static Map getUserMap() {
return userMap;
}
/**
* 当前登录用户所属单位,key=orgId,value=在线人数(int)
*/
private static Map orgMap = new LinkedHashMap();
public static Map getOrgMap() {
return orgMap;
}
private static Map sessionMap = new LinkedHashMap();
public static Map getSessionMap() {
return sessionMap;
}
private static Map docLockedMap = new HashMap();// key - "docLocked_"+docId value+"#"+userId
// value - sysUser - 记录文档加锁情况
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -