设为首页 加入收藏

TOP

Web应用中防止用户重复登录的简单实现方法(一)
2014-11-24 14:14:36 来源: 作者: 【 】 浏览:3
Tags:Web 应用 防止 用户 重复 登录 简单 实现 方法

主要使用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 onlineUsersMap = (Map) 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.renderjava script(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 onlineUsersMap = (Map) onlineUsersObject;
onlineUsersMap.put(ui.getId(), ui);
} else {
Map onlineUsersMap = new ConcurrentHashMap();
onlineUsersMap.put(ui.getId(), ui);
session.getServletContext().setAttribute(Constants.ONLINE_USERS_KEY, onlineUsersMap);
}
logger.info("----------002、登录后打印在线用户列表-------------");
for (Long id : ((Map) 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 onlineUsersMap = (Map) 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 onlineUsersMap = (Map) 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 != onlineUsersOb

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android组件TextView实现字体水平.. 下一篇jQuery及EasyUI学习心得

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: