可采用如下解决方案:
1 .当用户第一次登录时,把用户添加到一个ArrayList中,再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录。(说明,为保证该操作在每一次登录时都能执行,最好写在一个filter或listener中),代码参考如下:
public static List loginInfoList=Collections.synchronizedList(new ArrayList()); //保存所有登录帐户(要作为一个静态成员变量保存)
boolean accountLogined=false; // 账户是否已经登录
if(HomeController.loginInfoList.isEmpty()){
HomeController.loginInfoList.add(loginInfo); // loginInfo:当前登录帐户
}
}else{
for(int i=0;i<HomeController.loginInfoList.size();i++){
LoginInfo tempInfo=HomeController.loginInfoList.get(i);
if(tempInfo.getUserId().equals(MisUtils.getSessionUser(request).getId())){
accountLogined=true;// 当前账户已在使用
break;
}
}
if(!accountLogined){ // 列表中不存在该账户
HomeController.loginInfoList.add(loginInfo);
}
}
if(accountLogined){ throw new MisException("当前账户正在使用,不能重复登录");
}
2、当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况
① 使用注销按钮正常退出
② 点击浏览器关闭按钮或者用Alt+F4退出,可以用javascript捕捉该页面关闭事件,
执行一段java方法删除ArrayList中的用户
③ 非正常退出,比如客户端系统崩溃或突然死机,可以采用隔一段时间session没活动就删除该session所对应的用户来解决,这样用户需要等待一段时间之后就可以正常登录。
①③ 可采用相同的核心代码,只不过③须放在一个sessionListener中,参考代码如下:
Iterator<LoginInfo> it=HomeController.loginInfoList.iterator();
while(it.hasNext()){
LoginInfo tempInfo=it.next();
if(MisUtils.getSessionUser(req).getId().equals(tempInfo.getUserId())){ //MisUtils.getSessionUser(req).getId()为当前登录用户的id
it.remove();
}
}
说明:对于在遍历list的同时进行删除操作,最好通过Iterator,否则如果一次要删除多个元素时,通过loginInfoList.remove(i)可能出现与期望值不一样的结果。
对于② 浏览器关闭时,可在前台使用 window.onbeforeunload事件进行捕捉,并使用ajax从列表中删除用户,参考如下:
//窗口关闭时触发
window.onbeforeunload=function(){
if(event.clientX>document.body.clientWidth && event.clientY<0||event.altKey||window.event.ctrlKey){
$.get("destroyCurrentUser.htm"); //jquery中简单的ajax
}
}
其中destroyCurrentUser.htm中的核心代码与前面类似。
当然这种解决方案还存在许多问题,比如① 客户端死机情况下用户并不会从列表中删除,致使下次再无法登录;②当使用多标签浏览器时,关闭浏览器,window.onbeforeunload事件通常不会触发,导致登录用户也不会从列表中删除。所以最好是建一个可以无限次登录的super账户,并能查看登录用户列表及强制注销登录用户。如图所示:
分享到:
相关推荐
java web开发一个帐号同一时间只能一个人登录 .doc java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能).doc java中如何实现同一账号不能同时登录.doc session保证两用户不能同时登陆一个账号.doc
通过DWR实现一个用户在同一时间内只能登陆一次,再次登录会把前次登录提示下线,类似QQ。需自己建用户表,具体字段参见代码。建表后源码可运行
让一个账号,在同一段时间,只能允许他登录一次
Java实现同一账号限制同时登录,里面是源码,写得很清楚。利用application实现的,入门选手的福利
对于一个帐号在同一时间只能一个人登录,下文给大家介绍的非常详细,对java web qq 登录功能感兴趣的朋友一起看看吧
最近做了企业项目,其中有这样的需求要求同一帐号同一时间只能一个地点登陆类似QQ登录的功能。下面小编通过本文给大家分享实现思路,感兴趣的朋友参考下吧
java中如何实现同一账号不能同时登录
《Java Web开发完全掌握》主要内容简介:java是目前最受欢迎、应用最为广泛的跨平台程序设计语言之一。全书详细讲解了java web开发的相关技术知识,主要包括javascript、jsp、javabean、表达式语言(el)、jsp标签库...
Java网络编程 JAVA web开发实例讲解 宠物分类展现web项目 第05章 宠物分类展现模块的第一个动态版本实现(共31页).ppt Java网络编程 JAVA web开发实例讲解 宠物分类展现web项目 第06章 用JavaBean、EL和JSTL优化...
由于Java Web技术是SUN公司在Java Servlet规范中提出的通用技术,因此本书讲解的Java Web应用例子可以运行在任何一个实现了SUN的Servlet规范的Java Web服务器上。随书附赠光盘的内容为本书范例的源程序,以及本书...
轻松学Java Web开发,很经典的一个学习课件,希望帮到大家。
由于Java Web技术是SUN公司在Java Servlet规范中提出的通用技术,因此《Tomcat与Java Web开发技术详解》讲解的Java Web应用例子可以运行在任何一个实现了SUN的Servlet规范的Java Web服务器上。随书附赠光盘的内容为...
《Java Web开发实战1200例(第2卷)》以开发人员在项目开发中经常遇到的问题和必须掌握的技术为核心,介绍了应用Java Web进行程序开发的各个方面的知识和技巧,主要内容包括流行组件应用、数据库应用、图表统计、Ajax...
有关Java web开发技术\资料\Java教程 有关Java web开发技术\资料\Java教程 有关Java web开发技术\资料\Java教程 有关Java web开发技术\资料\Java教程 有关Java web开发技术\资料\Java教程 有关Java web开发技术\资料...
第1篇为准备篇,主要为Java Web开发概述,并手把手带领读者一块搭建Java Web开发环境;第2篇为基础篇,主要介绍HTML、CSS、JavaScript、Servlet、JSP和JavaBean等Java Web开发所需的基础知识,并对这些基础知识进行...
本书详细介绍了在最新Tomcat 5版本上开发Java Web应用的各种技术。主要内容包括:Tomcat和Java Web开发的基础知识,Java Web开发的高级技术,Tomcat与当前其他通用软件的集成,以及Tomcat的各种高级功能。
JavaWeb开发的一个学生管理系统软件
《21天学通Java Web开发》是Java Web开发的基础教程,针对没有接触过或还不是特别熟悉Java Web开发的读者,详细介绍了Java Web开发的基础概念及技术要点。全书分为6篇共21章内容,第一篇为Java Web基础篇,介绍了...
由于Java Web开发技术大全pdf文件太大120多M,上传资源要求在20M以内,所以大家必须要把Java Web开发技术大全.z01,Java Web开发技术大全.z02,Java Web开发技术大全.z03,Java Web开发技术大全.z04,Java Web开发...
java web接口开发demo 详细地址:http://blog.csdn.net/zxw136511485/article/details/51437115