我无法弄清楚Codeigniter中会话的实际错误是什么。我的其他项目正在使用此代码。但在这种情况下,我遇到了问题。
对于登录会话,我的代码是:
$data = array(
'username' => $this->input->post('username'),
'admin_logged_in' => true,
'logged_in' =>true
);
$this->session->set_userdata($data);
我将会话视为:
if ($this->session->userdata('admin_logged_in') == true) {
// code
}
在进入控制器之前,我正在检查上面的会话,如果会话不正确,则重定向到登录页面。
注销:
function logout() {
if ($this->session->userdata('admin_logged_in') == TRUE) {
$useremail = $this->session->userdata('username');
$data = array(
'username' => $useremail,
'admin_logged_in' => true,
'logged_in' =>true
);
$this->session->unset_userdata($data);
$this->session->sess_destroy();
redirect('login');
}
}
但上面的代码对我不起作用。当我注销时,页面被成功重定向到注销页面,但会话没有被销毁,因为我可以访问需要会话集的所有页面。请帮我。
我遇到了一个奇怪的问题。当我登录系统并注销时。并尝试访问需要会话的方法。如果我在没有index.php的情况下编写方法名,我可以访问。如果我用index.php编写方法名,我就无法访问需要会话的方法。 例: BnW需要设置会话以便更进一步。 如果我登录并注销,那么,如果我在borwser URL中写下:
example.com/index.php/bnw //it redirects to login page.
example.com/bnw //it logs in directly.
index.php
是否会产生会话问题?答案 0 :(得分:0)
把这个inside your logout function,
放在我身上
$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);
}
}
$this->session->sess_destroy();
答案 1 :(得分:0)
在config/autoload.php
$autoload['libraries'] = array('session');
您的.htaccess应该(应该放在应用程序文件夹之外)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
config/config.php
中的
如果2.0(第247行)
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 0;
如果3.0(第358行)
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 0;
$config['sess_regenerate_destroy'] = FALSE;
在控制器中
function logout()
{
$result = $this->model_name->check_login();
if ( $result == TRUE )
{
if(!empty($log))
{
$this->session->sess_destroy();
$this->index();//your logging should be here
}
else
{
//some code here
}
}
else
{
$this->index();
}
}
在模型中
public function check_login()
{
$log = $this->session->all_userdata();
if (isset($log['admin_logged_in']))
{
if($log['admin_logged_in'] == true)
{
return true;
}
else
{
return false;
}
} else
{
return false;
}
}
并且每个控制器检查是否设置了会话。如果设置加载视图,则直接指向索引功能。因此,这将阻止用户通过URL直接访问
检查登录的示例代码
$result = $this->model_name->check_login();
if($result==true)
{
//load your views as usual
}
else
{
//load index function
$this->index();
}
索引功能(在控制器中)
public function index()
{
$this->load->view('admin/logging');//load your loginf view here
}
答案 2 :(得分:0)
我认为在logout()
函数中,它不会进入if
块,因此会话不会被破坏
注意:如果您正在尝试的项目,该函数返回FALSE(布尔值) 访问不存在。
它没有说它返回TRUE
所以改变
if ($this->session->userdata('admin_logged_in') == TRUE)
到
if ($this->session->userdata('admin_logged_in') != FALSE)
并检查您的会话是否在sess_destroy()
$this->session->sess_destroy();
$admin_logged_in = $this->session->userdata('admin_logged_in');
echo "-----------------> $admin_logged_in";