我是Web开发的新手:
当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);
}
我认为您需要使用回调函数进行$.load
:
...
...
$('.myNav').load(this.pageToLoad, function(response, status, xhr) {
if (status == "error") {
console.log(msg + xhr.status + " " + xhr.statusText);
$(location).attr('href', "/login.php");
}
});
您需要"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(或其他代码)以指示会话已超时。
您可以使用 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 状态代码,则可以将条件更改为 if (xhr.status == 401)
。
改善该条件的另一个原因是,如果登录页面加载失败,我提出的示例代码可能会导致无限加载循环。但我想简明扼要。:)
如果没有一些代码,我猜你正在做这样的事情:
$('.nav').load('/some/url .nav');
用户注销后,服务器返回什么?它会返回 404 吗?403?
我会为.get
更改.load
.正如我所提到的,没有你提供任何代码,我只是猜测你的系统是如何工作的。在这里,我假设如果用户未登录,则div.nav
根本不存在:
$('.nav').get('/some/url', function(data){
var nav = $(data).find('.nav');
if(nav.length === 0) {
// not logged in. No nav to show. Redirect user to where they can log in
alert('Not Logged In. You will now be redirected');
location.href="/some/url/to/login";
return false;
}
//logged in. Replace nav
$('.nav').replaceWith(nav);
});