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

时间:2015-03-07 13:47:17

标签: php jquery

我是网络开发的新手:

当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);
    }

4 个答案:

答案 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