Codeigniter会话在登录时清除

时间:2013-06-13 10:28:12

标签: codeigniter session

我在会话中保存匿名用户的偏好。问题是当用户登录时,我必须清除以前的会话并启动新会话(出于安全原因)。

似乎我破坏会话,然后登录功能会退出!即使我在set_userdata之后使用sess_destroy它也无法登录(也许在破坏后会话变得无法使用)。 使用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('...');
}

2 个答案:

答案 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);
        }
    }
}

答案 1 :(得分:0)

请勿使用sess_destroy,除非您计划再次在同一网址上重定向。 只需使用

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

或者你可以创建一个你要销毁的会话array,并且只需添加一个空样本

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

这将使会话名称为session_idsession_id2 NULLFALSE

因为当您拨打sess_destroy()时,它会销毁该应用正在使用的所有session。即使您在调用它之后尝试添加另一个会话,也不会添加,因为没有活动会话,这就是为什么它不起作用。多次尝试,只有刷新或重定向回控制器/方法才能创建新会话。这就是CI中的会话如何运作,如果我错了,我不知道是否正确。

相关问题