我在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无法正常工作或我做错了什么?谢谢你提前。
答案 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中你正在访问你的控制器功能而不是查看。如果您将检查并重定向视图页面,即使您已取消设置会话数据,也不会重定向到您的登录控制器。