【问题标题】:Logout codeigniter注销代码点火器
【发布时间】:2011-12-23 13:55:22
【问题描述】:

我在 codeigniter 中有一个注销控制器:

<?php

class Logout extends MY_Controller {

    function index()
    {

        $this->session->sess_destroy();
        redirect('index.php');
    }
}

这会让我退出,但是当我在登录后调用另一个控制器时,比如“/site/addnewpost”, 这只是让我再次登录,就好像 sassion 之前没有被破坏一样。为什么会这样?

【问题讨论】:

  • 移除重定向。制作另一个仅包含 var_dump($_SESSION) 的脚本,并在注销后调用该脚本以检查会话是否真的被破坏
  • 您的登录部分是什么? (您在其中检查会话)
  • @xbonez - 如果我在这里错了,请纠正我,但我认为 CodeIgniter 不使用本机 PHP 会话。
  • @Tyil 你是对的,$_SESSION 肯定不会在这里设置,因为 CI 不使用它。我希望 OP 也不要把它们混在一起!
  • 啊,我的错。我使用 Codeigniter,但总是手动使用 $_SESSION。不知道 CI 维护自己的会话变量

标签: php codeigniter


【解决方案1】:

遵循 ALex 的建议,但使用 CI 代码:)。我的意思是,尝试单独取消设置每个会话数据。我读过一次关于版本 2.0.3 中的一个问题,但我现在不记得了,我没有时间搜索参考。但是,在他们的论坛中,建议是相同的:一个一个地取消设置每个会话元素。

$this->session->unset_userdata('data_one');
$this->session->unset_userdata('data_two');
$this->session->unset_userdata('data_three');
$this->session->unset_userdata('data_one');
$this->session->sess_destroy();
redirect('home','refresh');  // <!-- note that
//you should specify the controller(/method) name here

需要重定向,因为 CI 的会话只是 cookie,而不是原生 php 会话数组。

另一件事...确保错误不在您的登录方法中,无论您是否成功注销,它都会让您登录!

【讨论】:

    【解决方案2】:

    尝试像这样显式删除项目:

    $this->Session->delete('User');
    $this->Session->destroy();
    $this->Cookie->delete("User");
    $this->Cookie->destroy();
    $this->Auth->logout();
    $this->redirect('whereever');
    

    【讨论】:

      【解决方案3】:

      我的问题与服务器端的缓存有关。我能解决的最快的方法是在注销链接中附加随机文本:

      <?php
          $this->load->helper('string');
          echo anchor('/home/logout/'.random_string(), 'logout');
      ?>
      

      home/logout 包含与问题中的function index 相同的代码。

      您知道redirect('/', 'refresh') 对我不起作用,但我再次进行了快速测试。

      我猜random_string() 方法可以通过输出强制清除缓存的标头等来替换。正如您可能已经猜到的那样,我现在不能这样做,因为我非常忙。也许以后。

      【讨论】:

        【解决方案4】:

        您也可以尝试手动将“logged_in”或任何您调用的会话设置为 false。然后,销毁所有其他会话数据。

            $this->session->set_userdata('logged_in', FALSE);
            $this->session->session_destroy();
            redirect('index');
        

        【讨论】:

          【解决方案5】:

          首先我们必须加载会话库来处理会话,而不是取消设置 sessionID 并销毁会话。我正在使用此代码取消设置我的会话并确保注销。

          $this->load->library('session');
          $this->session->set_userdata('user_id', FALSE);
          $this->session->sess_destroy();
          $this->load->view('your URL');
          

          【讨论】:

          • 请不要发布仅代码的答案。包括对您所做更改的一些解释、为什么会起作用等。
          猜你喜欢
          • 2016-12-26
          • 1970-01-01
          • 2012-02-09
          • 2011-06-04
          • 2016-01-28
          • 2012-06-30
          • 2012-02-21
          • 2011-03-29
          • 2011-08-06
          相关资源
          最近更新 更多