使用Tank Auth时,flashdata不会存储在重定向之间

时间:2011-09-30 01:01:04

标签: codeigniter tankauth

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

当分别使用set_flashdata()和flashdata()时,重定向没有返回任何内容,但是如果我在配置中将sess_use_database设置为FALSE则可以正常工作。

我已经四处寻找并找不到答案 - 还有其他人遇到过这个问题并修好了吗?

4 个答案:

答案 0 :(得分: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();

然后它从auth控制器($this->_show_message())运行此代码:

$this->session->set_flashdata('message', $message);
redirect('/auth/');

问题是,由于sess_destroy()在设置flashdata之前运行,因此没有数据库行可以添加flashdata,因此flashdata永远不会被设置。

此时有一些解决方案:

选项1:

$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

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

最后,由您自行决定哪种方案最适合您的应用。

答案 1 :(得分:0)

如果tank_auth执行任何内部重定向,那么您可能会丢失该重定向请求中的Flash数据。

答案 2 :(得分: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()方法,该方法只会像你说的那样更新数据库。

答案 3 :(得分: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/');      
}