3

我正在构建的站点上使用最新版本的 Codeigniter 和 tank_auth 1.0.9。

当分别使用 set_flashdata() 和 flashdata() 时,重定向时不会返回任何内容,但如果我在配置中将 sess_use_database 设置为 FALSE,它就可以工作。

我四处搜索,找不到答案 - 有没有其他人遇到过这个问题并解决了它?

4

4 回答 4

2

我遇到了同样的问题并解决了问题。如果您将会话存储在数据库中,它将无法正常工作。

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

这是有效的,因为会话在再次请求时会自动创建,而不是在您将会话存储在数据库中时它的工作方式。可能不太安全。

最后,由您决定哪个选项最适合您的应用程序。

于 2012-07-24T01:32:05.543 回答
0

对我来说,更好的解决方法是在 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/');      
}
于 2013-10-04T01:49:58.593 回答
0

确切地。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()仅更新数据库的方法,如您所说。

于 2012-08-16T06:11:18.060 回答
0

如果 tank_auth 进行任何内部重定向,那么您可能会丢失该重定向请求上的闪存数据。

于 2011-12-15T22:13:38.097 回答