`
qnzhl
  • 浏览: 28715 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Web应用中防止用户重复登录的简单实现方法 .

web 
阅读更多
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<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("------------------------------------------------------------");
}


分享到:
评论

相关推荐

    Web应用程重复登录问题

    解决Web程序多台机器重复登录问题,解决Web程序多台机器重复登录问题

    Java Web中的入侵检测及简单实现

    在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据。当然,入侵检测可以用很多方法实现,包括软件、硬件...

    防止用户将表单重复提交的方法汇总

    表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用...

    Lotus Domino WEB详细 学习笔记

    21. 同一用户重复登录 18 22. Return to sender 19 23. Agent to copy values from 1 form to another 在同一个数据库中进行 22 24. 超越OLE – 通过COM结合MS Office与Notes应用 23 25. 读写关系数据库...

    几种防止表单重复提交的方法

    表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用...

    Lotus Domino WEB 开发技术积累-DOC(313页)

    21. 同一用户重复登录 18 22. Return to sender 19 23. Agent to copy values from 1 form to another 在同一个数据库中进行 22 24. 超越OLE – 通过COM结合MS Office与Notes应用 23 25. 读写关系数据库资料 28 26. ...

    net学习笔记及其他代码应用

    10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i ; i++) { if((i%2) == 1) { Sum += i ; ...

    网络数据库安全设计与实现.doc

    这个时候,可以先将角 色暂存在对应的数据字段中,可以防止该用户后续发出的数据库连接请求时,重复获取 该角色。 (3)当用户被重定向到最初界面的时候,事件处理程序就会创建对象Iprinicipal, 并将该对象保存在...

    ASP.NET3.5典型模块开发源代码

    1.2.6 根据用户登录身份显示不同效果页功能 9 1.3 基于角色的登录方式 10 1.3.1 在应用程序中启用角色 10 1.3.2 创建角色 10 1.3.3 创建角色访问规则 11 1.3.4 赋予用户角色权限 11 1.3.5 验证角色的...

    LotusDomino学习笔记.doc

    21. 同一用户重复登录 18 22. Return to sender 19 23. Agent to copy values from 1 form to another 在同一个数据库中进行 22 24. 超越OLE – 通过COM结合MS Office与Notes应用 23 25. 读写关系数据库资料 28 26. ...

    ASP200问.EXE

    158.如何在ASP中实现Ping 159.如何打印Iframe中的内容 160.如何用ASP实现网络打印 161.如何用组件实现本地特定打印 162.如何在ASP程序中打印Excel报表 163.如何在ASP中调用Java类 164.如何在线压缩和解压缩WinRAR...

    JavaScript完全自学宝典 源代码

    3.7.html 多维数组的实现方法。 第4章(\c04) 示例描述:介绍JavaScript的面向对象特性。 4.1.html 对象的创建。 4.2.html 作为关联数组的对象与数组对象实现方式比较。 4.3.html prototype的用法...

    Access 2000数据库系统设计(PDF)---001

    252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 ...

    Access 2000数据库系统设计(PDF)---002

    252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 ...

    Access 2000数据库系统设计(PDF)---018

    252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 ...

    Access 2000数据库系统设计(PDF)---011

    252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 ...

    Access 2000数据库系统设计(PDF)---020

    252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 ...

Global site tag (gtag.js) - Google Analytics