可采用如下解决方案:
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账户,并能查看登录用户列表及强制注销登录用户。如图所示:
分享到:
相关推荐
"一个账号同一时间只能登录一次"的功能,通常被称为单点登录(Single Sign-On,简称SSO),它能够防止恶意用户同时在多个设备或浏览器会话中登录同一个账号,确保了用户的账户安全。下面将详细讲解如何实现这一功能...
本项目实现了一个特定的功能:确保同一账号在同一时间只能在一个地方登录,一旦有另一人在不同地点尝试登录,已登录的用户将被强制下线。这种设计模式被称为“会话独占”,它在许多在线服务中,特别是安全性要求较高...
在IT行业中,"同一个账号,同一时间只能允许他登录一次" 这个需求通常被称为单点登录(Single Sign-On, SSO)。这是一个重要的安全性措施,防止用户账户被多个设备或不同地点同时使用,以增加系统的安全性,防止未经...
java web开发一个帐号同一时间只能一个人登录 .doc java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能).doc java中如何实现同一账号不能同时登录.doc session保证两用户不能同时登陆一个账号.doc
在Java Web开发中,实现QQ登录功能并限制一个账号同一时间只能一个人登录,涉及到的关键技术包括用户会话管理、状态跟踪以及异常情况处理。以下是对这个功能实现的详细解析: 首先,我们需要一个全局的存储结构来...
标题中的“利用Spring Security控制同一个用户只能一次登录”是指在基于Spring Security的Web应用程序中实现单点登录(Single Sign-On, SSO)的功能,确保同一时间只有一个设备或浏览器会话可以登录同一用户的账户。...
在Java Web开发中,防止多用户重复登录是一个重要的安全措施,确保每个账号只能在一个设备或浏览器会话中活跃。常见的解决方法有两种,本文主要探讨第二种方案。 首先,第一种解决方案是通过在数据库中添加一个标志...
在Java Web开发中,实现一个具有“记住我”功能的登录页面是一项常见的需求。这个功能允许用户在选择“记住用户名和密码”后,下一次访问网站时,系统能自动填充登录表单,提供便捷的用户体验。这个过程涉及到浏览器...
这里我们探讨的是一种集群环境下的解决方案,它允许我们确保一个账号在同一时间只能在一个地方登录,即实现“单点登录”功能。这个方案主要基于Spring Boot和Redis技术栈来实施。 **Spring Boot** 是一种基于Java的...
- 创建一个Cookie对象,设置名称为“cookie_user”。 - 将用户的账号和密码进行加密或哈希处理,以确保数据安全。 - 将加密后的账号和密码拼接成一个字符串,例如“账号-密码”,然后设置为Cookie的值。 - 设置...
"防止用户重复登录"这一话题,主要关注的是如何确保单一账号在同一时间只能在一个设备或浏览器会话中进行有效登录,以提升系统的安全性并保护用户的隐私。 一、为什么要防止用户重复登录? 1. 安全性:防止恶意...
在Java Web开发中,多用户登录限制是一个常见的需求,它涉及到用户安全性、用户体验以及系统资源的有效利用。本文将深入探讨如何在Java环境中实现这一功能,包括两种主要的实现策略,并提供具体的代码示例。 首先,...
在Java Web开发中,Cookie是客户端存储数据的一种方式,它用于在用户浏览器和服务器之间传递信息,实现会话管理、个性化设置等功能。本主题将详细讲解如何使用Java进行Cookie的读写操作,以及如何利用Cookie实现记住...
这个过程通常应用于Web项目中,以实现单点登录(Single Sign-On, SSO)或者限制同一账号在同一时间只能在一台设备上登录的功能,从而增强系统的安全性。 "Mac校验"中的"Mac"在这里并不是指网络中的Media Access ...
安卓上用于加载的Webview视图窗口只是作为类浏览器而存在,在安卓上更是只能同时运行一个Webview。(2)跨域数据交互问题。不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备...
《基于SSM的校园快递代领系统...综上所述,基于SSM的校园快递代领系统利用Java Web开发中的主流技术,实现了校园快递服务的信息化和便捷化,展示了Java开发的灵活性和实用性,是学习和实践Java Web开发的一个优秀案例。
在本项目中,我们主要探讨的是如何利用百度AI的人像识别技术来开发一个安全、便捷的登录模块。这个登录模块的实现是基于SSM(Spring、SpringMVC、MyBatis)框架,同时结合MySQL数据库进行用户信息管理。以下是关于这...
JSON-RPC for Java 是一个轻量级、零入侵的远程过程调用(RPC)框架,专为Java和AJAX应用程序设计。它支持级联调用,使得在分布式系统中的通信更为便捷。本使用说明主要基于《JavaScript 高级应用与实践》一书的作者...
在登录系统中,如果选择“记住我”功能,服务器通常会在用户成功登录后创建一个包含账号信息的Cookie,并设置较长的过期时间,这样即使关闭了浏览器,下次打开时仍然能自动登录。 1. **Cookie的工作原理**: - ...