【问题标题】:PHP, JQuery.load and expiring sessions - catching errorsPHP、JQuery.load 和过期会话 - 捕获错误
【发布时间】:2015-05-09 01:07:01
【问题描述】:

我是网络开发的新手:

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

【问题讨论】:

  • 请附上您的代码。帮助我们为您提供帮助。
  • 请提供一些代码。否则我们很难为您提供帮助。
  • 请查看有关如何提问的页面:stackoverflow.com/help/how-to-ask

标签: php jquery


【解决方案1】:

如果没有一些代码,我猜你正在做类似的事情:

$('.nav').load('/some/url .nav');

当用户退出时服务器返回什么?它会返回 404 吗? 403?

我会将.load 更改为.get。正如我所提到的,如果您不提供任何代码,我只是在猜测您的系统是如何工作的。在这里,我假设如果用户未登录,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);
});

【讨论】:

    【解决方案2】:

    我认为你需要使用$.load的回调函数:

    ...
    ...
    $('.myNav').load(this.pageToLoad, function(response, status, xhr) {
        if (status == "error") {
           console.log(msg + xhr.status + " " + xhr.statusText);
           $(location).attr('href', "/login.php");
        }
    });
    

    【讨论】:

      【解决方案3】:

      您需要“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(或其他代码)以指示会话已超时。

      【讨论】:

        【解决方案4】:

        您可以使用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)

        改善这种情况的另一个原因是,如果登录页面加载失败,我提出的示例代码可能会导致无限加载循环。但我想简洁。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 2010-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-06
          • 1970-01-01
          相关资源
          最近更新 更多