`

一个帐号同一时间只能一个人登录

    博客分类:
  • Java
阅读更多
对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现:

1 .在用户登录时,把用户添加到一个ArrayList中

2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录

3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况

① 使用注销按钮正常退出

② 点击浏览器关闭按钮或者用Alt+F4退出,可以用javascript捕捉该页面关闭事件,

执行一段java方法删除ArrayList中的用户

③ 非正常退出,比如客户端系统崩溃或突然死机,可以采用隔一段时间session没活动就删除该session所对应的用户来解决,这样用户需要等待一段时间之后就可以正常登录。



在LoginAction中定义:

// 用来在服务器端存储登录的所有帐号

public static List logonAccounts;



login() 登录方法中:

// 设置session不活动时间为30分

request.getSession().setMaxInactiveInterval(60*30);

if(logonAccounts==null){

    logonAccounts = new ArrayList();

}

// 查看ArrayList中有没有该用户

for (int i = 0; i < logonAccounts.size(); i++) {

    Account existAccount = (Account)logonAccounts.get(i);

    if(account.getAccountId().equals(existAccount.getAccountId())){

        return "denied";

    }

}

// 在用户登录时,把sessionId添加到一个account对象中

// 在后面 ③ 需要根据此sessionId删除相应用户

account.setSessionId(request.getSession().getId());

// 该用户保存到ArrayList静态类变量中

logonAccounts.add(account);

return "login";



① 使用注销按钮正常退出

logout() 退出方法中:

if(logonAccounts==null){

    logonAccounts = new ArrayList();

}

// 删除ArrayList中的用户  ⑴

for (int i = 0; i < logonAccounts.size(); i++) {

    Account existAccount = (Account)logonAccounts.get(i);

    if(account.getAccountId().equals(existAccount.getAccountId())){

        logonAccounts.remove(account);

    }

}



② 点击浏览器关闭按钮或者用Alt+F4退出:

在后台弹出一个窗口,在弹出窗口中删除ArrayList中的用户

function window.onbeforeunload(){

// 是否通过关闭按钮或者用Alt+F4退出

// 如果为刷新触发onbeforeunload事件,下面if语句不执行

    if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){

        window.open('accountUnbound.jsp','',

                'height=0,width=0,top=10000,left=10000')

    }

}



accountUnbound.jsp : 弹出窗口中删除ArrayList中的用户

<%

    Account account = (Account) request.getSession().getAttribute("account");

    if(account != null){

        if(LoginAction.logonAccounts==null){

            LoginAction.logonAccounts = new ArrayList();

        }

        // 删除ArrayList中的用户——下面代码和上面的 ⑴ 处一样

        for (int i = 0; i < logonAccounts.size(); i++) {

            Account existAccount = (Account)logonAccounts.get(i);

            if(account.getAccountId().equals(existAccount.getAccountId())){

                logonAccounts.remove(account);

            }

        }

    }

%>

为了保证上面代码可以执行完毕,3秒后关闭此弹出窗口(也位于accountUnbound.jsp中)

<script>

setTimeout("closeWindow();",3000);

function closeWindow(){

    window.close();

}

</script>



③ 使LoginAction 实现implements HttpSessionListener,并实现sessionCreated,sessionDestroyed方法,在sessionDestroyed中删除ArrayList中的用户(用户超过30分钟不活动则执行此方法)

public void sessionDestroyed(HttpSessionEvent event) {

   // 取得不活动时的sessionId,并根据其删除相应logonAccounts中的用户

   String sessionId = event.getSession().getId();

   for (int i = 0; i < logonAccounts.size(); i++) {

       Account existAccount = (Account)logonAccounts.get(i);

       if(account.getSessionId().equals(existAccount.getSessionId())){

           logonAccounts.remove(account);

       }

   }

}



注:

对于上面的,由于弹出窗口很容易被防火墙或者安全软件阻拦,造成无法弹出窗口,从而短时间不能登录,这种情况可以用AJAX来代替弹出窗口,同样在后台执行删除用户的那段代码,却不会受到防火墙限制:

<script>

    // <![CDATA[

    var http_request = false;

    function makeRequest(url) {

        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...

            http_request = new XMLHttpRequest();

            if (http_request.overrideMimeType) {

                http_request.overrideMimeType('text/xml');

            }

        } else if (window.ActiveXObject) { // IE

            try {

                http_request = new ActiveXObject("Msxml2.XMLHTTP");

            } catch (e) {

                try {

                    http_request = new ActiveXObject("Microsoft.XMLHTTP");

                } catch (e) {

                }

            }

        }

        if (!http_request) {

            alert('Giving up Cannot create an XMLHTTP instance');

            return false;

        }

        http_request.onreadystatechange = alertContents;

        http_request.open('GET', url, true);

        http_request.send(null);



    }

    function alertContents() {

        if (http_request.readyState == 4) {

            if (http_request.status == 200) {

                window.close();

            } else {

                alert('There was a problem with the request.');

            }

        }



    }

    function window. onbeforeunload() {

        makeRequest ('accountUnbound.jsp');

    }

    //]]>

</script>



对于上面的这段ajax代码,在网上有很多详细的解释,把它加到onbeforeunload()浏览器关闭事件中,在后台执行代码的效果很好,不必担心弹出窗口有时候会无效的问题。



使用这段代码后,上面②中accountUnbound.jsp中的那段关闭弹出窗口window.close();的js代码就不需要了。
分享到:
评论

相关推荐

    同一个账号,同一时间只能允许他登录一次

    在IT行业中,"同一个账号,同一时间只能允许他登录一次" 这个需求通常被称为单点登录(Single Sign-On, SSO)。这是一个重要的安全性措施,防止用户账户被多个设备或不同地点同时使用,以增加系统的安全性,防止未经...

    ASP帐号只能同时登陆一个

    标题提到的“ASP帐号只能同时登陆一个”,指的是同一个账号在同一时间只能在一个设备或浏览器会话上登录,这通常被称为单点登录(Single Sign-On, SSO)机制。 单点登录的设计目的是为了增强安全性,防止同一账号被...

    Asp.net中实现同一用户名不能同时登陆

    因此,限制同一用户账户在同一时间只能在一个地方登录是非常必要的。 #### 二、实现原理及步骤 本文介绍的方法主要是通过ASP.NET中的全局状态存储机制来实现的,具体步骤如下: 1. **使用Application对象存储在线...

    利用spring security控制同一个用户只能一次登陆

    通过以上步骤,我们就可以在Spring Security框架下实现单点登录,确保用户在同一时间只能在一个设备或浏览器上登录。这样的机制有助于提高系统的安全性,防止账户被恶意操作。标签“源码”表明了可能需要深入阅读和...

    Java Web 实现QQ登录功能一个帐号同一时间只能一个人登录

    在Java Web开发中,实现QQ登录功能并限制一个账号同一时间只能一个人登录,涉及到的关键技术包括用户会话管理、状态跟踪以及异常情况处理。以下是对这个功能实现的详细解析: 首先,我们需要一个全局的存储结构来...

    防止同一账号多个用户同时登陆的解决方法.txt

    3. **处理登录冲突**:一旦检测到同一账号在不同位置尝试登录,系统会将之前的登录状态`Login_status`设置回0,强制下线之前的登录会话,从而确保同一账号在同一时间只能在一个地方登录。 #### 利用ASP.NET管理登录...

    同一账号不能同时登陆

    这个需求主要是为了保护用户的安全,防止他人盗用账户或者避免多个人同时操作同一个账号导致的数据混乱。下面将详细解释两种实现这一功能的方法:使用Session和在数据库中设置一个字段。 **方法一:使用Session** ...

    PHP 实现一个账号仅允许一个用户登陆

    4. **会话唯一性**:为了确保一个账号只能在一个地方登录,我们可以创建一个额外的会话标志,例如`$_SESSION['single_login']`。在用户首次登录时,将其设置为真,并在数据库中记录该用户的会话ID。 5. **检测多处...

    java Web 同一个用户名同时登陆处理(全部五篇文档)

    java web开发一个帐号同一时间只能一个人登录 .doc java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能).doc java中如何实现同一账号不能同时登录.doc session保证两用户不能同时登陆一个账号.doc

    C#两个账号同时登录,后登录的账号将前一个账号挤掉

    在C#编程中,"同一个账号只能登录一次"的需求是一个常见的多用户系统设计规范,它旨在确保用户账户的安全性和系统的一致性。当一个账号在一处登录后,其他地方的同一账号尝试登录时,系统应该拒绝该请求或者强制结束...

    怎么避免一个账号多处同时登录

    该变量用于控制是否允许同一账号在同一时间内由不同的人或设备登录。 ```php //-- 是否允许多人用同一帐号同时登录 -- $ONE_USER_MUL_LOGIN = 0; //1 允许; 0 禁止; ``` 3. **设置禁止多处登录**:如果希望...

    Asp.net中实现同一用户名不能同时登陆(单点登陆)

    很多开发者都会遇到这样的情况:如何使同一个用户在同一时间内只允许登录一次。常见的解决方案是使用数据库中标识字段,登录时置 1,退出时置 0,但是这种方法存在一些问题,如用户直接关闭浏览器而不是通过程序中的...

    集群式项目解决一个账号只能登录一次。

    这里我们探讨的是一种集群环境下的解决方案,它允许我们确保一个账号在同一时间只能在一个地方登录,即实现“单点登录”功能。这个方案主要基于Spring Boot和Redis技术栈来实施。 **Spring Boot** 是一种基于Java的...

    C#一个账号只允许一个人登录的程序

    这个程序的核心理念是确保同一时间只有一个用户能够使用特定的账号进行登录,防止了多个人同时操作同一账号的情况,增加了系统的安全性。 首先,我们需要理解这个程序的基本架构。它通常包含以下几个关键部分: 1....

    完美解决ASP.NET网页在同一时刻仅被一个登录用户占用的方案例子代码

    在多用户环境中,确保一个ASP.NET网页在同一时刻仅被一个登录用户占用是非常重要的,这涉及到用户体验、数据一致性和安全性。这种需求通常被称为“独占访问”或“会话锁定”。 在ASP.NET中,实现独占访问的一种常见...

    基于Linux的TCP多人聊天室

    客户端:打开时可选择登录或者注册,登陆成功后由服务端记录为在线用户,同一个账号同一时间只能登录一个,后登录的会将已经在线的同个账号挤下线(异地登陆)。登陆后可以选择群聊、私聊、上传文件到共享网盘、查看...

    防止用户重复登录

    "防止用户重复登录"这一话题,主要关注的是如何确保单一账号在同一时间只能在一个设备或浏览器会话中进行有效登录,以提升系统的安全性并保护用户的隐私。 一、为什么要防止用户重复登录? 1. 安全性:防止恶意...

    asp.net下一个账号不允许多个用户同时在线,重复登陆的代码

    方法一: 复制代码 代码如下: string sKey = username.Text.ToString().Trim(); // 得到Cache中的给定Key的值 string sUser = Convert.ToString(Cache[sKey]); // 检查是否存在 if (sUser == null || sUser == String...

    Java 多用户登录限制的实现方法

    场景一要求同一时刻同一个用户只能在一个地方登录,如果尝试在另一处登录,前一次的登录会话将会被终止。场景二则是允许用户在不同设备或浏览器上登录,但当新的登录发生时,旧的登录会话会被挤掉,并且通知用户这一...

    多用户影视联盟系统2004

    特殊算法保障同一帐号同一时间只能有一个人使用; 14.可在后台设定阻止特定的IP地址登陆; 15.会员密码采用MD5加密,采用电子邮件取回密码,注册成功自动发送开通邮件; 16.管理员密码采用高强度MD5加密,最大程度上...

Global site tag (gtag.js) - Google Analytics