我在codeigniter中有一个注销控制器:
<?php
class Logout extends MY_Controller {
function index()
{
$this->session->sess_destroy();
redirect('index.php');
}
}
这会让我退出,但是当我在登录后调用另一个控制器时,例如“/ site / addnewpost”, 这只是让我再次登录,好像以前没有被摧毁过。为什么会这样?
答案 0 :(得分:11)
遵循ALex的建议,但使用CI代码:)。我的意思是,尝试单独取消设置每个会话数据。我读过一次关于版本2.0.3中的问题,我想,但我现在不记得了,我没有时间搜索引用。但是,它在他们的论坛中,并且建议是相同的:逐个取消设置每个会话元素。
$this->session->unset_userdata('data_one');
$this->session->unset_userdata('data_two');
$this->session->unset_userdata('data_three');
$this->session->unset_userdata('data_one');
$this->session->sess_destroy();
redirect('home','refresh'); // <!-- note that
//you should specify the controller(/method) name here
你需要重定向,因为CI的会话只是cookie,而不是原生的php会话数组。
另一件事......确保您的登录方法中没有错误,无论您是否成功注销,都会记录您的错误!
答案 1 :(得分:2)
尝试明确删除这样的项目:
$this->Session->delete('User');
$this->Session->destroy();
$this->Cookie->delete("User");
$this->Cookie->destroy();
$this->Auth->logout();
$this->redirect('whereever');
答案 2 :(得分:1)
我的问题与服务器端的缓存有关。我能解决的最快的方法是将随机文本附加到注销链接:
<?php
$this->load->helper('string');
echo anchor('/home/logout/'.random_string(), 'logout');
?>
home / logout在问题中包含与function index
相同的代码。
您知道redirect('/', 'refresh')
对我不起作用,但我再次做了快速测试。
我猜测random_string()
方法可以替换为输出标题,强制缓存被清除等等。正如你可能已经猜到的那样,我现在不能这样做,因为我超级忙。也许以后。
答案 3 :(得分:1)
您也可以尝试手动将“logged_in”或您调用的会话设置为false。然后,销毁所有其他会话数据。
$this->session->set_userdata('logged_in', FALSE);
$this->session->session_destroy();
redirect('index');
答案 4 :(得分:0)
首先我们必须加载会话库来处理会话,而不是取消设置sessionID并销毁会话。我正在使用此代码取消设置会话并确保注销。
$this->load->library('session');
$this->session->set_userdata('user_id', FALSE);
$this->session->sess_destroy();
$this->load->view('your URL');