我正在构建的站点上使用最新版本的 Codeigniter 和 tank_auth 1.0.9。
当分别使用 set_flashdata() 和 flashdata() 时,重定向时不会返回任何内容,但如果我在配置中将 sess_use_database 设置为 FALSE,它就可以工作。
我四处搜索,找不到答案 - 有没有其他人遇到过这个问题并解决了它?
我正在构建的站点上使用最新版本的 Codeigniter 和 tank_auth 1.0.9。
当分别使用 set_flashdata() 和 flashdata() 时,重定向时不会返回任何内容,但如果我在配置中将 sess_use_database 设置为 FALSE,它就可以工作。
我四处搜索,找不到答案 - 有没有其他人遇到过这个问题并解决了它?
我遇到了同样的问题并解决了问题。如果您将会话存储在数据库中,它将无法正常工作。
Tank Auth 从主库 ( $this->tank_auth->logout()
) 运行此代码:
$this->delete_autologin();
// See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
$this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));
$this->ci->session->sess_destroy();
然后它从身份验证控制器 ( $this->_show_message()
) 运行此代码:
$this->session->set_flashdata('message', $message);
redirect('/auth/');
问题是,由于sess_destroy()
在设置 flashdata 之前运行,没有数据库行可以添加 flashdata,因此 flashdata 永远不会被设置。
此时有几个解决方案:
选项1:
在函数in$this->ci->session->sess_create();
之后立即添加$this->ci->session->sess_destroy();
logout()
application/libraries/Tank_auth.php
这是有效的,因为您正在创建一个可以存储 flashdata 的新空白会话。一个潜在的缺点是您正在对数据库执行更多操作(删除+插入)。
选项 2:
注释掉/删除$this->ci->session->sess_destroy();
函数logout()
application/libraries/Tank_auth.php
这是有效的,因为会话没有被破坏,允许 CI 只执行更新查询来添加 flashdata。除非您绝对需要销毁会话,否则这可能比选项 1 更好。
选项 3:
设置$config['sess_use_database']
为FALSE
。
这是有效的,因为会话在再次请求时会自动创建,而不是在您将会话存储在数据库中时它的工作方式。可能不太安全。
最后,由您决定哪个选项最适合您的应用程序。
对我来说,更好的解决方法是在 show_message() 中设置 flashdata 之前检查以确保会话存在。
function _show_message($message)
{
// Patch for show_message() after logout(). Make sure the session exist before set_flashdata().
if(!$this->session->sess_read())
{
$this->session->sess_create();
}
$this->session->set_flashdata('message', $message);
redirect('/auth/');
}
确切地。CodeIgniter 文档在此处指定:http: //codeigniter.com/user_guide/libraries/sessions.html
=============================
Destroying a Session
To clear the current session:
$this->session->sess_destroy();
Note: This function should be the last one called,
and **even flash variables will no longer be available**.
If you only want some items destroyed and not all, use unset_userdata().
=============================
我已经深入研究了 system/libraries/Session.php 文件并保存 flashdata 会触发sess_write()
仅更新数据库的方法,如您所说。
如果 tank_auth 进行任何内部重定向,那么您可能会丢失该重定向请求上的闪存数据。