如何在Codeigniter中以特殊方式销毁所有会话?

时间:2011-04-19 00:58:03

标签: session codeigniter

在我的代码中,我有注销功能,如下所示

function logout() 
{
    $this->session->sess_destroy();  

    // but, don't destroy this session
    $this->session->userdata('admin_id');
}

如何销毁所有会话,除了'admin_id'?

4 个答案:

答案 0 :(得分:3)

CI中的会话销毁是在下一个请求时执行的,因此您无法在没有请求的情况下销毁会话并打开新会话。

但您可以取消设置所有会话数据,除了您要保留的数据以及Codeigniter需要保留会话的数据。这取决于会话的配置方式,默认情况下是用户代理,最后一个活动和会话ID。请参阅CI-Session class偏好设置(位于页面底部)

此功能删除除admin_id

以外的所有会话数据
 $sessionData = $this->session->all_userdata();
 foreach($sessionData as $key =>$val){
    if($key!='session_id' 
       && $key!='last_activity' 
       && $key!='ip_address' 
       && $key!='user_agent' 
       && $key!='admin_id'){
         $this->session->unset_userdata($key);
     }
  }

答案 1 :(得分:2)

您可能希望暂时保存admin_id,并在销毁所有会话变量后将其重新置于会话中。

$temp = $this->session->userdata('admin_id');
$this->session->sess_destroy();
$this->session->set_userdata('admin_id', $temp);

答案 2 :(得分:1)

你必须在会话中保存一些密钥,这里是正确的代码。

$sess_array = $this->session->all_userdata();
foreach($sess_array as $key =>$val){
   if($key!='session_id'
      && $key!='last_activity'  
      && $key!='ip_address'  
      && $key!='user_agent'  
      && $key!='RESERVER_KEY_HERE')$this->session->unset_userdata($key);
}

这对你有用:)

答案 3 :(得分:0)

$this->session->sess_destroy();会破坏会话的session_idlast_activity。因此会话不再存在。所以这不会奏效。

试试这个:

$sess_array = $this->session->all_userdata();

foreach($sess_array as $key =>$val){

   if($key!='session_id'||$key!='last_activity'||$key!='admin_id'){
   $this->session->unset_userdata($key);
    }

  }