如何处理AJAX请求中的会话超时

时间:2009-06-17 04:41:26

标签: php session error-handling jquery

我相信你们都熟悉使用AJAX的投票系统(嗯......看那边< ----)

我有类似的东西,当你向上或向下投票时,它使用AJAX从votes.php请求新值。问题是我正在使用会话获取用户ID,因此一个人只能投票一次。如果他们在页面上坐了一个小时然后投票,那么会话不再存在会发生什么?处理这种情况的好方法是什么?我应该将他们的页面重定向到登录屏幕吗?如果是这样,我怎么能从AJAX请求引用的votes.php页面中做到这一点?我是否忽略了处理这种情况的好方法?任何建议都会有所帮助。

6 个答案:

答案 0 :(得分:11)

考虑返回401的http状态,以及详细说明原因的JSON对象。如果您正在使用jQuery,那么您将转到error()回调,然后您可以解析对象。

$.ajax({
  data: {},
  dataType: 'html',
  success: function(data) {
    // do whatever here
  },
  type: 'POST',
  url: 'myserver.com',
  error: function(XMLHttpRequest, textStatus, errorThrown) {
    // XMLHttpRequest.responseText has your json string
    // XMLHttpRequest.status has the 401 status code
    if (XMLHttpRequest.status === 401) {
      location.href = 'login.php';
    }
  }
});

我不再熟悉PHP,但这应该适用于任何环境。您可能必须禁止任何自动登录表单重定向。在asp.net mvc中,框架将看到401并返回默认登录表单,状态为200.

答案 1 :(得分:1)

您应该只在会话中存储指向用户身份的链接。使用会话将用户标识为 x ,然后从数据库中获取用户 x 的信息。

如果问题在于用户会话超时,那么您应该重新考虑如何使用会话。也许让它们持续到浏览器关闭为止?如果你真的想让它们成为一个持续时间,那么可能会间隔地ping服务器以保持会话的活跃性。

确定您的php脚本是否应该能够投票。如果未设置会话,或者他们已经投票,则返回您可以在客户端识别的消息。如果他们已经投票,可能会在JSON对象中返回"voted":"true"。使用JS解析此对象并理解其含义,采取适当的操作。如果未设置会话,可能会返回"session_set":"false",然后使用window.location = "login.php"等进行javascript重定向。

仅在成功返回计票时为用户增加计数器。

答案 2 :(得分:1)

这是一个老线程,但我想分享我的解决方案,该方法非常有效。

在我的框架中,系统会在用户尝试访问页面时将用户重定向到登录表单,并且会话已超时或无效。 我在登录表单的顶部添加了以下html注释:

<!--LOGINFORM-->

我为jQuery的$ .ajax函数创建了一个包装器,它在每个请求上检查这个字符串,如果它在那里,它会显示一个对话框弹出窗口,说明它们的会话已经超时。

您只需拨打:

即可使用此功能
ajax.get('http://someurl.com', function(data){
    //Do stuff
});

希望它有所帮助。

var ajax = {
    check_login : function(resp){
        if (resp.substring(0, 16) === "<!--LOGINFORM-->"){
            // Show a popup or redirect them to login page!
            return true;
        }
        return false;
    },
    get : function(url, success){       
        if (typeof data =='undefined'){
            data = null;
        }

        $.ajax({
            url: url,
            type : 'GET',
            success : function(resp){
                if (!ajax.check_login(resp)) {
                    success(resp);
                }
            },
        });
    }   
};

答案 3 :(得分:0)

您构建了使Ajax请求接受特殊结果的Javascript代码(例如-1,其中>=0数字通常是,例如,投票数)表示“抱歉” bub,你已经超时“并重定向到重新登录页面(可以作为一个可选参数,向用户说明他们超时的消息,&amp; c)。

答案 4 :(得分:0)

您可以创建一个javascript函数,可以通过

之类的内容每10分钟ping一次服务器
setTimeout("Ping()", 60000); 

如果您希望将用户导航到登录页面,如果他们连接有故障的会话,那么我将首先验证会话,如果失败则发送

header("Location: ...");

http://ca2.php.net/manual/en/function.header.php

答案 5 :(得分:0)

从用户的角度来看,最好的解决方案是弹出一条消息和登录表单,说“你没有登录或你的会话超时”。 Digg做得非常好。

至于实际的AJAX实现,swilliams的401建议是可靠的。或者,您可以在失败时返回特定字符串。