4

我在 CI 1.7.3 应用程序中使用Tank Auth进行用户管理。一切正常,但我试图设置flash_message在用户注销时显示。问题是该$this->tank_auth->logout();函数破坏了会话。我已将 Tank Auth 库中的注销功能修改为如下所示:

    function logout()   {
        $this->delete_autologin();

        // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
        $user_session_data = array('user_id' => '', 'username' => '', 'status' => '');
        $this->ci->session->set_userdata($user_session_data);
        $this->ci->session->unset_userdata($user_session_data);
    }

以前是

function 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();
        }

在我的控制器中,我有

function logout(){
    if ($this->tank_auth->is_logged_in()) { // logged in
        $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out'));
        $this->tank_auth->logout();

        redirect('');           

    } 

}

如果我删除该$this->tank_auth->logout();功能,则消息显示正常。我确定这是一个简单的会话问题

4

3 回答 3

7

如果您在调用后尝试在同一请求中使用数据库时设置 flashdata sess_destroy(),它将不起作用(因为没有会话可将 flashdata 附加到)。

To fix this problem, add $this->ci->session->sess_create(); after the call to sess_destroy(). This works because you're re-creating the session before trying to append data to it. This is the only way to use flashdata after a sess_destroy() if you're using sessions in a database.

于 2012-07-24T13:56:45.287 回答
2

sess_destroy()函数还破坏了用于传递消息的会话闪存变量。

你已经回答了你的问题,在库logout()函数中,你需要替换

$this->ci->session->sess_destroy();

$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

这不会完全破坏会话,只会破坏用于登录的用户数据,因此我建议改为修改logout()控制器中的函数并手动显示消息,将其传递给视图。

于 2011-12-31T15:26:10.537 回答
1

虽然这是一种解决方法,但它可能会为您解决问题......

无论您在哪里显示这些,我都会假设您正在查看视图,所以...

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? endif; ?>

您可以在其中添加一个elseif并检查引用者是否是您的注销功能...

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? else if ($this->agent->referrer() == site_url('path/to/logout'): ?>

    <p><?= $this->lang->line('auth_message_logged_out') ?></p>

<? endif; ?>

克服这个问题的有点骇人听闻的方法,但可能仍然是一种方法。

于 2011-03-17T13:04:49.823 回答