我是网络开发的新手:
当PHP会话到期时,我的导航栏(基于JQuery.load)停止运行,因为我猜它无法再加载请求的页面。用户体验是"冻结"。如何检测到这样的负载故障并将人们重新引导回登录屏幕(在警告会话过期后)?
这是我使用的代码:
function loadPage(page)
{
switch (page)
{
case 1: // dashboard
this.pageToLoad = 'pages/page1.php';
break;
case 16: // another page
this.pageToLoad = 'pages/page2.php';
break;
default: // unimplemented for all the rest
this.pageToLoad = 'pages/unimplemented.php';
break;
}
$('.myNav').load(this.pageToLoad);
}
答案 0 :(得分:1)
我认为你需要使用$.load
的回调函数:
...
...
$('.myNav').load(this.pageToLoad, function(response, status, xhr) {
if (status == "error") {
console.log(msg + xhr.status + " " + xhr.statusText);
$(location).attr('href', "/login.php");
}
});
答案 1 :(得分:1)
您需要“ping”服务器以检查用户是否仍然登录。
window.setInterval(ping, 60000);
function ping() {
$.ajax('/authcheck')
.done(function(){
console.log('done');
// user is still logged in
})
.fail(function () {
console.log('fail');
// location.href = "/user/login";
// user is no longer logged in
});
}
如果会话仍处于活动状态,则/ authcheck URL应返回200或204,或者403(或其他代码)指示会话已超时。
答案 2 :(得分:1)
您可以使用load
回调函数来检测加载失败并将用户重定向到登录页面。
我看到升级代码的最简单方法是:
function loadPage(page) {
switch (page) {
case 1: // dashboard
this.pageToLoad = 'pages/page1.php';
break;
case 16: // another page
this.pageToLoad = 'pages/page2.php';
break;
case 32: // login page
this.pageToLoad = 'pages/login.php';
break;
default: // unimplemented for all the rest
this.pageToLoad = 'pages/unimplemented.php';
break;
}
$('.myNav').load(this.pageToLoad, function(response, status, xhr) {
if (status == "error") {
loadPage(32);
}
});
}
您可以改进会话过期的检测,从而更改if (status == "error")
条件。
例如,如果系统正确返回401 status code on session expiration,您可以将条件更改为if (xhr.status == 401)
。
改善该条件的另一个原因是,如果登录页面加载失败,我提出的示例代码可能会导致无限加载循环。但我想简明扼要。 :)
答案 3 :(得分:0)
如果没有一些代码,我猜你正在做类似的事情:
$('.nav').load('/some/url .nav');
用户退出时服务器返回什么?它会返回404吗? 403?
我会更改.load
的{{1}}。正如我所提到的,如果没有您提供任何代码,我只会猜测您的系统是如何工作的。在这里,我假设如果用户未登录,则.get
根本不存在:
div.nav