这边我们理想是使用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字段是否一致,不一致则提示并退出,相对于第一种,虽然响应上没那么时时,但是却减缓了服务器的压力)
这边思路已理出,代码就不贴了,很容易就知道怎么写。
我这边也很想知道有没有更方便,更好的方法,希望能一起探讨一番
有兴趣的小伙伴可以关注我的公众号哦~ 里面有很多自己平时积攒起来的学习资源,Python,web安全,前端,Java等,都是免费领取的