2010-08-01 92 views
2

我有這樣的代碼在我的控制器無法檢索會話ID在笨

class Upload_center extends Controller 
{ 
    function __construct() 
    { 
     parent::Controller(); 
     $this->load->model('auth_model') ; 
     if(!$this->auth_model->authorize()) 
     { 
      redirect('login'); 

     } 

    } 

,我必須在我看來這個代碼

$('#swfupload-control').swfupload({ 
    upload_url: "<?=base_url()?>index.php/upload_center/upload", 
    file_post_name: 'fileupload', 
    file_size_limit : "200000000", 
    file_types : "*.zip;*.rar;*.pdf;*.doc;*.docx;*.mp3;*.avi;*.wmv;*.docx;*.jpg;*.jpeg;*.JPG;*.JPEG;*.png;*.gif;*.bitmap;", 
    file_types_description : "zip files ", 
    post_params: {"PHPSESSID": "<?=$this->session->userdata('session_id');?>"} , 
    file_upload_limit : 1, 
    flash_url : "<?=base_url()?>js/jquery-swfupload/js/swfupload/swfupload.swf", 
    button_image_url : '<?=base_url()?>js/jquery-swfupload/js/swfupload/wdp_buttons_upload_114x29.png', 
    button_width : 114, 
    button_height : 29, 
    button_placeholder : $('#button')[0], 
    debug: false 

我希望用戶後,上傳自己的文件登錄,所以我有一種方法需要用戶登錄才能繼續上傳文件。儘管我在我的視圖中使用Flash上​​傳器,但我認爲它不會傳遞會話值,PHP認爲用戶未登錄並將其重定向到登錄頁面。我發郵件phpsessionid但仍然沒有去。

回答

7

什麼是您的會話cookie過期設置爲?在CodeIgniter中存在一個已知的錯誤,如果您留在頁面上使AJAX請求超過cookie過期,它將重置數據庫中的會話ID,但無法將其設置在瀏覽器cookie中,因爲它是異步請求。這會導致下一個非異步GET請求發生斷開連接,導致會話庫調用sess_destroy()。如果這聽起來像你的情況,讓我知道。否則,請提供更多細節。

編輯:我應該,也許應該在這裏也包括這個bug的修復。在/ application/libraries中創建一個名爲「MY_Session.php」的文件(如果它尚不存在)。在那裏你可以粘貼此:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
/* 
* Session Class Extension 
*/ 
class MY_Session extends CI_Session { 
    /* 
    * Do not update an existing session on ajax calls 
    * 
    * @access public 
    * @return void 
    */ 
    function sess_update() { 
     if (!isAjax()){ 
      parent::sess_update(); 
     } 
    } 
} 
?> 

這isAjax()函數是一個輔助我在/application/helpers/isajax_helper.php,看起來像這樣:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
/** 
* is_ajax_call 
* 
* Determines if the current page request is done through an AJAX call 
* 
* @access public 
* @param void 
* @return boolean 
*/ 
if (! function_exists('isAjax')) { 
    function isAjax() { 
     return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'; 
    } 
} 
?> 

這是在引用我的配置文件是這樣的:

$autoload['helper'] = array('otherhelper1', 'isajax', 'otherhelper2'); 
+5

您現在可以[自2.0.x版本]使用'$這個 - >輸入 - > is_ajax_request() '而不是創建'isAjax()'。 – 2012-01-01 17:30:02

1

默認情況下,CI創造了一個定義的時間間隔一個新的會話ID。看看配置,看看默認值(我相信它是5分鐘)。所以$this->session->userdata('session_id')將始終包含一個不同的ID,但CI仍然能夠知道你是誰。

我碰到問題的原因完全一樣。我知道爲什麼CI的人創造了這個會議的茶點,但我覺得它讓事情變得更加複雜。只需輸入更高的會話刷新值,即可在配置中覆蓋此行爲。

在我的應用程序之一,它看起來像這樣:

$config['sess_expiration'] = 7200; 
//$config['sess_time_to_update'] = 300; 
$config['sess_time_to_update'] = $config['sess_expiration']; 

這種方式,我能夠使用會話,我就沒有做框架。

1

不可能。 Session類不使用本地PHP會話。

最佳做法,我建議你

contoller contain uploadpage { 
    function index(){ 
     $dataview['session_id'] = $this->secureUpload(); 
     $this->load->view('upload',$dataview); 
    } 
    function secureUpload(){ 
     $user_id = $this->session->userdata('cuser_id'); 
     $md5pass = $this->basemodel->_getEncrypPassFromDb($user_id); 
     $time =time(); 
     $session = md5($user_id.$time.$md5pass)."x".$user_id."x".$time; 
     return $session; 
    } 
} 

上傳頁面

('#swfupload-control').swfupload({ 
    post_params: {"PHPSESSID": "<?=session_id?>"} , 

這樣decryp您的安全代碼

 function upload_function(){ 

      list($session2, $user_id, $time) = explode("x", $session); 
    $this->load->library('upload', $config); 
    $md5pass = $this->basemodel->_getMD5pass($user_id); 
    $session_server = md5($user_id.$time.$md5pass)."x".$user_id."x".$time; 

    if($session_server == $session){ 
      upload file by flash upload 
      } 

}

1

我只是有這個問題,阿賈克斯調用破壞我登錄的用戶會話。按照Sturgeon先生的建議,這裏是@treeface解決方案,CI 2.1.2。我猜輸入和加載庫不是在CI_Session中自動加載的,所以我必須讓CI對象的實例來實現這個功能。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
/* 
* Session Class Extension 
*/ 
class MY_Session extends CI_Session { 

    protected $_CI; 

/* 
* Do not update an existing session on ajax calls 
* 
* @access public 
* @return void 
*/ 
function sess_update() { 

    $this->_CI =& get_instance(); 

     if (!$this->_CI->input->is_ajax_request()){ 
      parent::sess_update(); 
     } 
    } 
}