`
qnzhl
  • 浏览: 29097 次
  • 性别: 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程序多台机器重复登录问题

    Asp.net中防止用户多次登录的方法

    常见的处理方法是,在用户登录时,判断此用户是否已经在 Application 中存在,如果存在就报错,不存在的话就加到 Application 中。Application 是所有 session 共有的,整个 web 应用程序唯一的一个对象。以下是引用...

    基于springboot实现表单重复提交.docx

    表单重复提交是指在一次请求完成之前防止重复提交,解决表单重复提交有多种形式,以下以 Aop+自定义注解+Redis 为例来介绍。 解决方案的详细流程 1. 当页面加载时,前端请求后台,后台生成 token 缓存到 Redis ...

    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前端应用十种常用技术.pdf

    防止重复提交的不是很难,而且对于大多数Web应用程序来说做到这一点是非常必要的。 四、模拟窗口的阴影 模拟窗口的阴影在弹出菜单和窗口下的阴影不止是看起来很漂亮这么简单。它们帮助菜单或者窗口通过强调从背景...

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

    表单重复提交是在多用户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. ...

    web应用技术课程设计报告图书管理系统.doc

    Web 应用技术课程设计报告图书管理系统 网页应用技术是现代计算机科学技术中的一种重要技术,涉及到软件开发、网络编程、数据库设计等多个领域。下面是对该技术的详细介绍和分析。 一、系统简介 本系统是基于 ...

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

    JSP避免Form重复提交的三种方案

    JSP 避免 Form 重复提交的三种方案是指在 Web 应用程序中,用户在提交 Form 后,如何防止用户不小心或恶意地重复提交表单数据,避免对服务器端和数据库造成不必要的负载和影响。下面是三种常见的解决方案: 一、...

    网络数据库安全设计与实现.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的用法...

Global site tag (gtag.js) - Google Analytics