`

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

阅读更多

对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现:

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,并实现sessionCreatedsessionDestroyed方法,在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代码就不需要了。

分享到:
评论

相关推荐

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

    Web项目中经常遇到的问题就是同一用户名多次登陆...本文介绍的方法是采用类似于MSN登陆的方法,第二次登陆时会把第一次的登陆注销掉,第一次登陆将会类似于MSN弹出:您的帐号已在别处被登陆,您被强迫下线的提示信息。

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

    对于一个帐号在同一时间只能一个人登录,下文给大家介绍的非常详细,对java web qq 登录功能感兴趣的朋友一起看看吧

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

    NULL 博文链接:https://lihao312.iteye.com/blog/1909205

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

    NULL 博文链接:https://onestopweb.iteye.com/blog/2380986

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

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

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

    完美解决ASP.NET网页在同一时刻仅被一个登录用户占用的方案例子代码。http://www.linjon.cn, 成都领君科技有限公司

    基于Linux的TCP多人聊天室

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

    多用户影视联盟系统2004

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

    入门学习Linux常用必会60个命令实例详解doc/txt

    这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...

    网趣网上购物系统时尚版

    用户帐号一站式通用,即无无论是在商城还是在论坛只须注册一个帐号即可,全站使用,是目前网上开店的理想平台。 三七、增加了商城报价中心功能! 对于商城商品数量较多的网站,查找一个商品或快速浏览商品是经常的...

    网趣网上购物系统的部分特点与精华

    用户帐号一站式通用,即无无论是在商城还是在论坛只须注册一个帐号即可,全站使用,是目前网上开店的理想平台。 三八、增加了商城报价中心功能! 对于商城商品数量较多的网站,查找一个商品或快速浏览商品是经常的...

    网趣网上购物系统时尚版V13.0

    用户帐号一站式通用,即无无论是在商城还是在论坛只须注册一个帐号即可,全站使用,是目前网上开店的理想平台。 三八、增加了商城报价中心功能! 对于商城商品数量较多的网站,查找一个商品或快速浏览商品是经常的...

    网趣网上购物系统HTML静态版v2012版

    根据商城的设计原则,对于同一商品如果多次点购买分按一个商品购买多次计算,但用户选择的同一个商品,如果选择了不同颜色或尺码,这个问题就出现了,Html静态版现已解决这个问题,同一商品选择不同颜色或尺码进行...

    您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。拒绝访问解决方法

    首先在共享资源提供端创建一个新的账号,然后指定该账号的访问权限。接下来在要访问该共享资源的客户机中新建一个相同用户名和密码的账号,使用此账号登录客户机后,就能正常访问该账号所允许的共享资源。此方法较为...

    50用户在线考试系统

    本考试系统由前台考生考试部分和后台系统管理部分组成。 一、前台部分 1、 选择课程: ...“后台抽题”是把多人同时在线抽题的工作交给管理员一个人进行,考生只要登陆后做好准备就行了。适合大型...

    网趣网上购物系统时尚版 V9.0

    根据商城的设计原则,对于同一商品如果多次点购买分按一个商品购买多次计算,但用户选择的同一个商品,如果选择了不同颜色或尺码,这个问题就出现了,时尚版现已解决这个问题,同一商品选择不同颜色或尺码进行多次...

    Art2008 CMS 网站管理系统 v3.1.rar

    支持一个会员账号只允许一个会员登录,可以有效防止一个会员账号多人使用的情况; 支持会员注册信息管理,轻松地收集所需的会员资料; 支持会员登录时是否需要验证码; 支持自定义会员组 支持注册会员赠送资金、...

    2009达内SQL学习笔记

    select:从一个或多个表中检索一个或多个数据列。包含信息:想选择什么表,从什么地方选择。必须要有From子句。(最常用) 当从多张表里查询的时候,会产生笛卡尔积;可用条件过滤它。 当两个表有相同字段时必须加...

    2009 达内Unix学习笔记

    感觉是同一文件,删除一个,对另一个没有影响;须两个都删除才算删除。 ln -s file1 file1.sln 创建软链接。可跨系统操作,冲破操作权限;也是快捷方式。 八、时间显示 date 显示时间,精确到秒 用法 date [-u]...

    网趣商城网站源文件

    在更换全新编辑器的基础上,增加了“上传文件管理”进行更新,使商品大小图与编辑器所上传的图片共享一个目录,这样可以实现“上传文件管理”功能可以管理所有系统上传的图片的浏览与删除操作,解决了原来只能删除...

Global site tag (gtag.js) - Google Analytics