问题描述
|
在我的代码中,我具有以下注销功能
function logout()
{
$this->session->sess_destroy();
// but,don\'t destroy this session
$this->session->userdata(\'admin_id\');
}
如何销毁除“ admin_id”以外的所有会话?
解决方法
CI中的会话销毁是在下一个请求时执行的,因此您不能销毁会话并在之间没有请求的情况下打开新会话。
但是您可以取消设置所有会话数据,除了要保留的数据和Codeigniter保留会话所需的数据。这取决于会话的配置方式,默认情况下是用户代理,上一个活动和会话ID。请参阅CI-Session类首选项(在页面底部)
此函数删除除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);
}
}
,您可能要临时保存admin_id,并在销毁所有会话变量后将其放回会话。
$temp = $this->session->userdata(\'admin_id\');
$this->session->sess_destroy();
$this->session->set_userdata(\'admin_id\',$temp);
,您必须在会话中保存一些密钥,这是正确的代码。
$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);
}
这将为您工作:),$this->session->sess_destroy();
破坏会话的session_id
和last_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);
}
}