2012-07-12 63 views
2

我有一個簡單的長輪詢情況。CodeIgniter在AJAX調用後會丟失會話

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?"); 
} 

我會看着螢火蟲5-10分鐘,它工作正常,但最終還是會說GET (302 Redirect)和響應將包含我的auth/login.php文件中的html。

會話是由本地CI_Session類的數據庫驅動的。他們在2小時後過期,而不是5-10分鐘。我嘗試了其他問題中看到的一些事情,但目前爲止沒有任何工作。我錯過了什麼?

+0

你使用TankAuth? – 2012-07-12 20:40:46

+0

不,我推出了自己的認證庫。 is_logged_in()僅僅基於'($ this-> session-> userdata('logged_in')=== TRUE)返回TRUE或FALSE' – 2012-07-12 20:42:20

+2

這是Codeigniter的一個衆所周知的錯誤,與會話cookie沒有關係我認爲正在更新。我會建議做一個搜索,因爲有很多現有的解決方案。 – 2012-07-12 20:55:52

回答

3

這個破解爲我解決了這個問題。當請求來自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。僅在CI 1.7.2,YMMV上進行測試。

問題是我很快被解僱了ajax請求。定期在其中一個觸發sess_update。而且,有時候,同時會有第二個Ajax請求。該請求將提供最近過期的會話密鑰,並且代碼點火器將刪除該會話。

此修補程序的工作原理是隻允許在非Ajax請求上進行會話更新。這是一個瘋狂的,但它的作品。

0

在您的會話配置文件中更改sess_expire_on_close。不太清楚爲什麼它有幫助...可能是CI中的一個錯誤。