web端同一账户同时登陆踢掉前一个登录的用户

这边我们理想是使用localstorage去存取用户登录信息,因为是保存在客户端本地,无需访问服务器,且可实现永久保存,节省网络流量

关于cookie和session和storage的详细解说网址:

https://www.cnblogs.com/pengc/p/8714475.html

而登录的当前时间(具体到秒)+userid作为用户的登录标识(本来想使用mac作为用户登录的唯一标识,但这个似乎更快一点哈哈)

前提准备:

用户信息表中增加storage字段用来存储客户端local信息

流程:

当用户登录时,生成local码(自定义,userid+DateTime.Now.ToString())

验证账号密码,如果无误,将local码更新至数据库中storage字段。

更新成功后,将此结果返回在ajax中。然后再客户端判断是否存在localstorage,具体代码如下:

if (localStorage.getItem("userid") != null
   && 
   localStorage.getItem("localstorage1") != null) {
                        localStorage.removeItem("userid");
                        localStorage.removeItem("localstorage1");
                    }
                    localStorage.setItem("userid", ay[0]);
                    localStorage.setItem("localstorage1", data);
                    window.location = 'main.html';

此时,如果另一个用户登录,执行上面步骤;

如何让前一个登录的用户退出登录,并提醒呢?

我所想到的有两种解决方式:

第一种(js时时访问数据库,查询数据库的storage字段和本地localstorange字段是否一致,不一致则提示并退出,但是这种方法会大大增加服务器的压力)

js中增加loginAjax方法,方法中无疑就是ajax访问数据库,这边就不写出来了。

setInterval

$(function () {
     //setInterval (间歇调用)
		var icount=setInterval("loginAjax()", 20000);	
            clearInterval(iCount);
	});

settimeout(推荐) 

 $(function () {
           exitLocal();
        });
 function exitLocal() {
            var count = 0;
            $.ajax({
                type: 'Post',
                url: 'method/Login.ashx',
                data: { },
                success: function (data) {
                    if (data != 1) {
                        alert("您的账号正在异地登录,导致您被迫下线,请及时修改账号密码");
                        clearTimeout(count);
                        window.location = 'Login.html';
                    } else {
                        count= setTimeout("exitLocal()", 6000);
                    }
                }
            });
        }

下面附加为什么选择settime而不是setinterval的原因

https://www.cnblogs.com/lengyuehuahun/p/5650030.html

主要原因是超时调用如果前面有线程阻挡,那么会停下来,而间歇调用只按照规定的时间走,不会停,导致如果弹出框没有理会它,到了时间后会继续弹框,一直累加。

第二种(在用户进行操作或者页面刷新时,访问数据库中storage字段和本地localstorange字段是否一致,不一致则提示并退出,相对于第一种,虽然响应上没那么时时,但是却减缓了服务器的压力)

这边思路已理出,代码就不贴了,很容易就知道怎么写。

我这边也很想知道有没有更方便,更好的方法,希望能一起探讨一番

发布了13 篇原创文章 · 获赞 1 · 访问量 2922

猜你喜欢

转载自blog.csdn.net/huxinyu0208/article/details/91349169