在AJAX调用中,CodeIgniter在一段时间后丢失了会话

时间:2012-07-12 20:35:06

标签: javascript jquery ajax codeigniter

我有一个简单的长轮询情况。

的jQuery

function poll(){
    $.get(url,{},function(data){ poll(); });
}

PHP (为简洁而删除了计时内容)

function responds_to_poll()
{
    if( ! $this->current_user()->is_logged_in())
    {
        redirect('auth/login');
    }

    echo json_encode("Whats up?");
}

我会看Firebug 5到10分钟,但它运行正常,但最终会说GET (302 Redirect)并且响应将包含我auth/login.php文件中的html。

会话是使用本机CI_Session类进行数据库驱动的。它们在2小时后过期,而不是5-10分钟。我已经尝试过在其他问题中看到的一些事情,但到目前为止还没有任何工作。我错过了什么?

2 个答案:

答案 0 :(得分:4)

这个黑客为我解决了这个问题。当请求来自XHR请求时,它只会取消sess_update次呼叫。

system/application/config/constants.php

中定义此内容
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');

然后,使用以下内容创建system/application/libraries/My_Session.php

class MY_Session extends CI_Session {
    public function __construct($params = array())
    {
            parent::CI_Session($params);
    }

    public function sess_update()
    {
            if ( IS_AJAX )
            {
                    parent::sess_update();
            }
    }
}

基于this thread的Hack。仅在CI 1.7.2,YMMV上进行了测试。

问题是我很快被解雇了ajax请求。其中一个会定期触发sess_update。而且,有时,会同时发出第二个ajax请求。该请求将提供最近过期的会话密钥,代码点火器将删除该会话。

此修复程序仅允许对非Ajax请求进行会话更新。这是一个kluge,但它的确有效。

答案 1 :(得分:0)

更改会话配置文件中的sess_expire_on_close。不太清楚为什么它有帮助......可能是CI中的一个错误。