【问题标题】:Destroy Session but keep flashdata销毁会话但保留 flashdata
【发布时间】:2011-03-16 22:39:33
【问题描述】:

我在我的 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(); 函数,则消息显示正常。我确定这是一个简单的会话问题

【问题讨论】:

    标签: php session codeigniter tankauth


    【解决方案1】:

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

    要解决此问题,请在调用 sess_destroy() 之后添加 $this->ci->session->sess_create();。这是有效的,因为您在尝试将数据附加到会话之前重新创建会话。如果您在数据库中使用会话,这是在 sess_destroy() 之后使用 flashdata 的唯一方法。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        <? 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-11-16
          • 2011-11-25
          • 1970-01-01
          • 2012-05-25
          • 2011-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多