0

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

看来如果我销毁会话,那么登录功能就会注销!即使我set_userdatasess_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('...');
}
4

2 回答 2

0

运行后尝试重新初始化会话库sess_destroy()

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

更新:

似乎 CI 没有本机功能来清除会话而不损坏脚本运行时的其余部分。

但是,寻找根本原因得到了手动答案

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);
        }
    }
}
于 2013-06-13T10:30:42.647 回答
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 会话的工作方式,如果我错了,我不知道纠正我。

于 2013-06-13T10:39:44.370 回答