会话数据未在codeigniter中清除

时间:2015-12-04 05:58:39

标签: php codeigniter session login

我在codeigniter中创建了一个简单的登录,用户输入他/她的用户名和密码,如果有效则转到某个受保护的页面。受保护的页面有一个名为logout的链接。但问题是在注销后,如果我直接访问受保护的页面,它不会重定向到登录页面。

我的受保护页面包含

<?php
    if (!isset($this->session->userdata['loggedin'])) {
        redirect("login");
    }
?>
Welcome Dear!!
<a href="login/logout">Logout</a>

我已成功设置用户凭据后设置会话数据。

 //set the session variables
 $sessiondata = array(
    'username' => $username,
    'loggedin' => TRUE
 );
 $this->session->set_userdata($sessiondata);
 redirect('admin');  

在注销方法中(登录是我的控制器)我已经取消了这样的会话数据 -

// Removing session data
    $sess_array = array(
    'username' => '',
    'loggedin' => FALSE
    );
    $this->session->unset_userdata($sess_array);

但是当我直接访问管理页面(受保护)时注销后,它不会重定向到登录页面。

注销后,我在登录页面上使用此调试,它显示已存储的会话值。

echo $this->session->userdata['username'];

但是当我使用logout方法时,它可以正常工作。

$this->session->sess_destroy();

有谁能告诉我为什么会出现这种情况? unset_userdata无法正常工作或我做错了什么?谢谢你提前。

3 个答案:

答案 0 :(得分:1)

好的,我解决了这个问题。问题是在取消设置会话数据时,codeigniter不接受对的数组。即

我在我的应用程序中使用了这段代码 -

...
<ui:submenu name="Chapter A">
    <ui:menuitem link="/ThisPage.do?field(mode)=optionA">Printoption A</ui:menuitem>
    <ui:menuitem link="/ThisPage.do?field(mode)=optionB">Printoption B</ui:menuitem>
    <ui:menuitem link="/ThisPage.do?field(mode)=optionC">Printoption C</ui:menuitem>
    ...
</ui:submenu> 
<ui:submenu name="Chapter B">
    ...
</ui:submenu>
...

但是codeigniter现在不支持这个。我用下面的代码

修改了这段代码
// Removing session data
$sess_array = array(
'username' => '',
'loggedin' => FALSE
);
$this->session->unset_userdata($sess_array);

现在工作正常。

参考 - https://www.codeigniter.com/user_guide/libraries/sessions.html

// Removing session data
$sess_array = array('username','loggedin');
$this->session->unset_userdata($sess_array);

答案 1 :(得分:1)

在codeigniter中处理会话时出现问题  功能性:

  $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')
            $this->session->unset_userdata($key);
    }

答案 2 :(得分:-1)

以上回答Ashis Biswas很好,你还需要注意你应该在控制器中检查你的登录会话,就像在codeigniter中你正在访问你的控制器功能而不是查看。如果您将检查并重定向视图页面,即使您已取消设置会话数据,也不会重定向到您的登录控制器。