【问题标题】:Codeigniter session regenerated after browser close浏览器关闭后重新生成 Codeigniter 会话
【发布时间】:2013-06-06 16:39:38
【问题描述】:

我有一种情况,我需要将信息存储到 codeigniters 会话中 -> 能够关闭浏览器窗口 -> 然后打开浏览器窗口并让它恢复我存储在会话中的所有项目。我知道 codeigniter 实际上并没有使用会话,而是使用 cookie,所以这应该很容易......但事实并非如此。

在 FF / Safari / Chrome 中这工作正常,但在 IE 9 中,当我关闭然后重新打开窗口时,它会重新生成会话 ID 并且不会拉回数据。

例如这个简单的代码:

$this->CI->session->set_userdata('username','My Username');
echo $this->CI->session->userdata('username');

第一次运行时按预期输出。然后我注释掉第 1 行并刷新屏幕,会话数据再次正确显示。

现在我关闭浏览器窗口并将其打开到同一页面,再次注释掉第 1 行。它找不到会话数据,会话 id 现在已更改。

我在 codeigiter 中将会话保存到数据库中,我的会话配置如下所示:

$config['sess_cookie_name']     = 'bcsession';
$config['sess_expiration']      = 0;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = TRUE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;

【问题讨论】:

  • 当然codeigniter“实际上”使用会话。它可以将会话数据存储在 cookie 或数据库中。在数据库的情况下,您仍然会有一个包含会话 ID 的 cookie,因此它可以将其与数据库匹配。

标签: session codeigniter-2


【解决方案1】:

你需要设置config.php:

$config['sess_expiration'] = 写入秒数

这是您希望会话持续的秒数。默认值为 2 小时(7200 秒)。如果您想要一个没有过期的会话,请将值设置为零:0。

$config['sess_expire_on_close'] = TRUE;

浏览器窗口关闭时是否使会话自动过期。 FALSE 是默认值,但您需要更改。

更多详情请阅读:http://www.codeigniter.com/userguide2/libraries/sessions.html

非常感谢

【讨论】:

    【解决方案2】:

    我已经找到了解决方案,以防它影响到其他人。

    CI 会话实际上是 cookie,正如我上面的逻辑,但我不敢相信我没有发现它,但 IE 具有在退出时删除浏览器历史记录/cookies/缓存的设置。这是票。

    为什么你总是先看最复杂的原因而不是最明显的原因!

    【讨论】:

      【解决方案3】:

      我相信sess_expiration 可能需要一个非零 值来解决您的问题。试试看,删除数据库表中的会话,然后再试一次。

      来自Is possible to keep session even after the browser is closed?

      在开始会话之前使用 session_set_cookie_parameters() 为会话 cookie 赋予非零生命周期,或将 session.cookie_lifetime 设置为非零。

      Codeigniter 将在 $config['sess_expiration'] 上调用该函数,因此请尝试将其设置为非零值。

      【讨论】:

      • “设置为零表示没有过期。”来自关于该参数的 codeigniter 配置文件 cmets。
      • 是的 0 意味着 codeigniter 将其设置为 2 年,我可以在 IE 的调试工具中正确看到它正常工作。我已经尝试了 0 和一个实际数字,尽管它是一个错误
      • @ChrisG。 - 所以只是为了检查。据我所知,Codeigniter 将会话 ID 存储在 cookie 和数据库中。我曾认为因为我现在有一个 cookie 集,所以它没有使用 php 样式的会话。从你所说的那是不对的,它仍在使用 php 会话,如果 php 会话 id 与 cookie 会话 id 不匹配,它会重新生成它?
      • 我实际上是在模仿这个人遇到的问题stackoverflow.com/questions/14359806/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2014-08-15
      • 2011-12-17
      相关资源
      最近更新 更多