加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Web应用中防止用户重复登录的简单实现措施

发布时间:2021-11-24 18:07:46 所属栏目:教程 来源:互联网
导读:主要使用application, listener, 把用户id和用户对象放到ConcurrentHashMap中,再存入application中 1、登录时把id和对象放到application中 2、登出时把remove掉 3、listener sessionDestroyed的时候,把对象session的key从application中去掉 一、登录时 //

主要使用application, listener, 把用户id和用户对象放到ConcurrentHashMap中,再存入application中
 
 
 
1、登录时把id和对象放到application中
 
2、登出时把remove掉
 
3、listener sessionDestroyed的时候,把对象session的key从application中去掉
 
 
 
一、登录时
 
// 2009.10.29 防止多处登录
Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY);
logger.info("on line user object is null: {}", null == onlineUsersObject);
 
 
if (null != onlineUsersObject) { // 不为空,说明有用户在线。
Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject;
logger.info("----------001、打印在线用户 id 列表(检查用户是否已经在列表中)---");
for (Long id : onlineUsersMap.keySet()) {
logger.info(String.valueOf(id));
}
logger.info("------------------------------------------------------------------------");
for (Long id : onlineUsersMap.keySet()) {
if (id.equals(userInfo.getId())) {
logger.info("{} == {}", id, userInfo.getId());
msg = super.getMessage(request, "login.failed.username.hadLogined");
super.renderJavaScript(response, "window.onload=function(){alert('" + msg
+ "');location.href='login.do" + queryString + "'}");
return null;
}
}
}
 
 
 
// 2009.10.29 防止多处登录
// Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY);
if (null != onlineUsersObject) {
Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject;
onlineUsersMap.put(ui.getId(), ui);
} else {
Map<Long, UserInfo> onlineUsersMap = new ConcurrentHashMap<Long, UserInfo>();
onlineUsersMap.put(ui.getId(), ui);
session.getServletContext().setAttribute(Constants.ONLINE_USERS_KEY, onlineUsersMap);
}
logger.info("----------002、登录后打印在线用户列表-------------");
for (Long id : ((Map<Long, UserInfo>) session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY)).keySet()) {
logger.info(String.valueOf(id));
}
logger.info("------------------------------------------------------------------------");
 
 
 
二、登出时
 
HttpSession session = request.getSession(false);
UserInfo ui = (UserInfo) session.getAttribute(Constants.USER_INFO);
 
 
// 在 application 中删除已经注销的用户
Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY);
if (null != onlineUsersObject) {
Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject;
logger.info("user is null ? {}", ui);
if (null != ui) {
onlineUsersMap.remove(ui.getId());
}
logger.info("------003、手动注销前打印在线用户列表-------------");
for (Long id : onlineUsersMap.keySet()) {
logger.info(String.valueOf(id));
}
logger.info("------------------------------------------------------------");
}
 
 
if (null != session) {
session.removeAttribute(Constants.USER_INFO);
session.invalidate();
}
 
 
if (null != onlineUsersObject) {
Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject;
onlineUsersMap.remove(ui);
logger.info("------004、手动注销后打印在线用户列表-------------");
for (Long id : onlineUsersMap.keySet()) {
logger.info(String.valueOf(id));
}
logger.info("------------------------------------------------------------");
}
 
 
 
三、OnlineSessionListener
 
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
logger.info("sessionDestroyed:{};session id is {}", session, session.getId());
 
 
Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY);
 
 
UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_INFO);
logger.info("userInfo is null:{}", null == userInfo);
 
 
if (null != onlineUsersObject && null != userInfo) {
Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject;
logger.info("---------------从在线列表中移除超时用户id前打印在线用户列表-------------");
for (Long id : onlineUsersMap.keySet()) {
logger.info(String.valueOf(id));
}
logger.info("------------------------------------------------------------");
for (Long id : onlineUsersMap.keySet()) {
if (id.equals(userInfo.getId())) {
logger.info(String.valueOf(id));
onlineUsersMap.remove(id);
}
}
logger.info("---------------从在线列表中移除超时用户id后打印在线用户列表-------------");
for (Long id : onlineUsersMap.keySet()) {
logger.info(String.valueOf(id));
}
logger.info("------------------------------------------------------------");
}

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读