PHP,JQuery.load和过期会话 - 捕获错误


PHP, JQuery.load and expiring sessions - catching errors

我是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);
});