论证和研究
我有一个需要用户登录才能查看的网站。当用户登录时,我想关注他们的用户会话。我的意思是我想知道他们的用户会话是否已过期,因此重定向他们。
每个用户的会话持续 1 小时(或我设置的任何时间),如果他们访问不同的页面(如大多数登录系统),则会重置。
目前,我有以下算法:
- 用户到达私有页面(调用的javascript方法
isUserAuthorized()
被执行) - javascript 方法向页面“ajax.example.net/authorized ”
isUserAuthorized()
发出 AJAX 请求 - 此页面返回一个 JSON 对象,指示用户的当前状态,如下所示:
{ authorized: true, timeout: 3600000 }
- 然后 javascript 方法设置超时以在
timeout
毫秒内再次调用该方法,假设会话将在那时结束。 timeout
如果会话已结束,则重定向用户,否则以毫秒为单位调用方法。
我不喜欢这种当前方法有两个原因:
- 我在客户端和服务器时钟之间的时间同步方面遇到了问题,这很奇怪,但它肯定会导致问题......
- 它在网页的背景中留下了一个超时,并且由于这个站点的 javascript 很重,我宁愿没有这个额外的超时,以保持站点尽可能流畅。
我的问题
因此,我的问题是,有人能想出更好的方法来实现这一目标吗?我曾考虑过长轮询或 websockets,但我不是 100% 确定如何使用其中任何一个,而且我发现的 websockets 教程不是很好!这些实际上会是更好的解决方案吗?
我可以解决时间同步问题,但在此之前,我想确保没有更好的方法来实现这一点......
如果有帮助,这是我当前的代码:
// Set the Authorized Timeout
MN.authorizedTimeout = setTimeout(function(){MN.isUserAuthorized});
/**
* Is User Authorized
* Checks to see if the current user is authorized and
* makes sure their session is still active
*/
MN.isUserAuthorized = isUserAuthorized;
function isUserAuthorized(){
// TEMPORARY
console.log('authorising');
// Set the authorized var
var authorized = false;
// Clear the current timeout
clearTimeout(MN.authorizedTimeout);
// Send request to determine whether the user is authorized
$.ajax({
url: "//ajax.example.net/authorized",
type: "GET",
dataType: "JSON",
cache: false,
async: false,
success: function(data){
console.log(data);
if(data.authorized){
// If the user is authorized then check again in timeout milliseconds
MN.authorizedTimeout = setTimeout(MN.isUserAuthorized,data.timeout_milliseconds);
// Set authorized to true
authorized = true;
}else{
// If the session has expired then proceed to informing the user
MN.userSessionExpired();
// Set authorized to false
authorized = false;
}
}
});
// Return the session status boolean
return authorized;
}