2013-06-13 101 views
0

我保存會話中匿名用戶的首選項。問題是,當用戶登錄時,我必須清除以前的會話並啓動新的會話(出於安全原因)。登錄時Codeigniter會話清除

看來如果我銷燬會話,那麼登錄功能會做註銷!儘管我在sess_destroy之後使用set_userdata,但它無法進行登錄(可能會導致破壞後的會話無法使用)。 使用unset只能在幾個指定的會話中執行。是否有任何方法可以在沒有這種問題的情況下清除用戶的所有會話?

public function login() 
{ 
    if($this->session->userdata('id')) 
     redirect($this->config->base_url()); 
    if($_POST) 
    { 
     ... 
     $user=... 
     if($user) 
     { 
      $this->session->sess_destroy(); 
      $this->session->set_userdata('id',$user['id']); 
      .... 
     } 
     else 
     { 
      ....  
     } 
    } 
    $this->load->view('...'); 
} 
+0

http://stackoverflow.com/questions/10509022/codeigniter-unset-all-userdata-but-not-destroy-the-session有你正在尋找的答案。 –

+0

@MaximKumpan,工作正常,請張貼此鏈接作爲答案。 – gerrnar

+0

嚴格來說,這看起來並不重複,所以我在下面貼出了這個答案的摘錄。儘管試圖更徹底地研究你的問題,但是查詢的一個簡單的重新短語可以創造奇蹟。 –

回答

0

試運行後sess_destroy()重新初始化會話庫。

$this->session->sess_destroy(); 
$this->load->library('session'); 
$this->session->set_userdata('id',$user['id']); 

更新:

看來,CI沒有一個本地函數來清除會話,而不會損壞它的腳本運行的其餘部分。

但是,尋找根本原因產生了a manual answer

function unset_only() { 
    $user_data = $this->session->all_userdata(); 

    foreach ($user_data as $key => $value) { 
     if ($key != 'session_id' && $key != 'ip_address' && $key != 'user_agent' && $key != 'last_activity') { 
      $this->session->unset_userdata($key); 
     } 
    } 
} 
+0

它沒有幫助。順便說一句,庫是在構造函數中加載的。 – gerrnar

0

,除非你打算在同一網址再次重定向回不使用sess_destroy。 只是用

$this->session->set_userdata('id','')

,或者你可以創建要銷燬,並在它的價值只是添加一個空樣品

$test = array('session_id'=>'','session_id2'=>''); 
$this->session->set_userdata($test); 

這將與名稱session_id該會話的會話的arraysession_id2NULLFALSE

因爲當您撥打sess_destroy()我t破壞應用程序正在使用的所有session。即使你在調用它之後嘗試添加另一個會話,它也不會添加,因爲沒有活動的會話,這就是爲什麼它不起作用。嘗試過很多次,只有刷新或重定向回控制器/方法纔會生效,以便創建新會話。這就是CI中的會話如何工作,如果我錯了,我不知道我是否正確。

+0

是真的!但如果我有很多項目未設置,並且在開發過程中增加了更多的會話項目,我如何保證所有項目都可以清除。在這裏你只需清除'session_id'。但如果會話包含'語言',''權限'和其他選項,我不希望他們與認證用戶混合。有什麼方法可以清除配置項中所有會話的內容? – gerrnar