【问题标题】:how to maintain session in codeigniter如何在codeigniter中维护会话
【发布时间】:2013-09-17 10:35:12
【问题描述】:

我正在开发一个用 codeigniter 编码的网站。目前,我的登录系统遇到问题。当注册用户成功登录并点击浏览器后退按钮时,他会再次重定向用户登录页面。

在登录视图加载的登录控制器中,我设置了一个条件,即如果用户已经登录,则将他重定向到仪表板。但是登录成功后,如果我单击浏览器返回按钮,它会再次重定向到登录页面.

我的控制器功能,其中登录视图加载为:

    if($this->session->userdata('logged_in') && $this->session->userdata('logged_in') !=''){

        header('location:'. base_url().'message/inbox');

    }
    else
    {
        $this->template->load('template', 'login');
    }

我是 codeigniter 的新手,对它了解不多。请任何人帮助我并指出我的代码中有什么问题。

谢谢。

【问题讨论】:

  • 顺便说一句。这部分:` && $this->session->userdata('logged_in') !=''` 是多余的。
  • 会话本身有问题吗?登录后是否保留了登录的用户数据(即设置了会话值)?

标签: php codeigniter


【解决方案1】:

后退按钮通常会加载前一页的缓存版本。您的问题与 CodeIgniter 无关。

阅读this 了解如何解决您的问题。虽然它不适用于 PHP,但它会向您展示如何正确设置您的标头并在登录页面打开时删除logged_in 会话变量。

编辑

所以标题需要采用这种格式:

header('Expires: -1'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Pragma: no-cache');

如果您知道如何在纯 PHP 中解决您的问题,那么 CodeIgniter 中的方法是相同的。只需清除您的会话或强制重定向(无论您喜欢哪个),同时确保缓存设置为以正确的方式工作。

【讨论】:

  • 我应该在哪里使用see Response.AddHeader ?登录控制器或登录视图加载的方法?
  • 只使用 PHP 的 header 函数,就像你为重定向所做的那样,并将它放在登录控制器中。标头应始终先加载,然后再有任何输出。
  • 我应该这样使用它吗?标头(“过期”,“-1”); header("Cache-Control", "no-store, no-cache, must-revalidate"); header("Pragma", "no-cache");
  • 我知道我的问题在自定义 php 中有一个非常简单的解决方案,方法是检查登录页面顶部的会话,如果设置,然后使用标题,不允许登录页面再次加载。但是在 codeigniter 中,这让我非常困扰。
【解决方案2】:

您是否在控制器构造函数中加载了会话?

$this->load->library('session');

【讨论】:

  • 是的,会话库是在 autoload.php 中加载的
  • 点击浏览器后退按钮后,它再次重定向到登录,但我重新登录了登录页面,然后根据需要重定向到用户仪表板。
  • 用其他浏览器检查,估计没问题。登录页面可能已从临时文件或缓存中加载。
  • 我在 chrome、IE、firefox 中检查过。同样的问题。
【解决方案3】:

在每个控制器类的每个构造中使用下面

if(!$this->authentication->try_session_login()){
    redirect('manage/login');
    }

$this->authentication->try_session_login这一行的详细信息:-

authentication = create an libyrary function named authentication. 
                In that library define try_session_login() function.

也可以使用此身份验证库进行登录。

我个人在我的应用程序中使用了这个过程。

【讨论】:

  • 我没有使用库,而是使用了一个辅助函数,如果设置了会话,则返回 true,否则返回 false。这对我来说也不起作用。
  • 尽可能使用库。否则,对于您的辅助函数,请先将其加载()到您的类中,然后再调用。你有什么错误吗?
【解决方案4】:

如果您单击浏览器后退按钮,它会从浏览器历史记录中加载页面。它会始终向您显示登录页面。尽管您已经进行了一些检查,但它会从历史记录中加载页面。为此,您需要禁用浏览器后退按钮.

现在,如果您将代码放在每个函数的开头,例如

if(!$this->session->userdata('logged_in'))
{
    redirect('controller_name/function_name','refresh');
}

它将检查会话并相应地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2011-11-08
    • 2013-11-18
    相关资源
    最近更新 更多