4

简短的问题:

为什么当我的会话的到期时间在服务器上更新时,我的会话 cookie 的到期时间没有在浏览器中更新?

长问题:

几周前我发布了一个类似的问题,但当时我没有所有的事实。我现在有更多细节,问题的性质已经改变,所以我将它作为一个新问题发布。

首先,在 CakePHP 2 中,我为会话设置了 APP/Config/core.php:

    Configure::write('Session', array(
        'defaults' => 'database',
        'cookie' => 'mycookie',
        'timeout' => 1 // 1 minute - just for testing
    ));

因此,我在我的应用程序中加载了一个页面,该页面在数据库中创建了会话。到目前为止一切都很好。

会话被标记为过期,1341288066等于Tue, 03 Jul 2012 04:01:06 GMT。同样,这很棒,因为那是从现在开始的 1 分钟。正是我想要的。

如果我查看 Firefox 的 cookie 屏幕,我会发现 cookie 与我预期的一样:

    Name: mycookie
    Content: aqm0gkmjfsuqje019at8cgsrv3
    Host: localhost
    Path: /
    Send for: Any type of connection
    Expires: Tue 03 Jul 2012 11:01:06 AM ICT  // (04:01:06 GMT)

现在,在这 1 分钟的窗口内,我回到我的应用程序并刷新页面。然后,我检查会话以查看它是否已更新。它显示1341288122的会话 idaqm0gkmjfsuqje019at8cgsrv3等于Tue, 03 Jul 2012 04:02:02 GMT我所期望的。会话的到期时间已更新为距离我上次重新加载页面的 1 分钟。

不幸的是,浏览器中的 cookie 仍然设置为Expires: Tue 03 Jul 2012 11:01:06 AM ICT(ie: 04:01:06 GMT),这正是它所做的,这意味着下次我按下刷新时,Cake 会生成一个全新的会话 ID,即使旧的会话 ID 在技术上仍然有效。

我的问题基本上是这里发生了什么?为什么 cookie 没有在浏览器中更新为新的到期日期?

4

3 回答 3

4

您发现的问题确实出乎意料,并结束了他们应该保持活力的会话。

这是 CakePHP 如何使用 PHP 的 Session 函数的结果。CakePHP bugtracker 中有一个条目 ( #3047 ),Mark Story (CakePHP 开发人员)同意应该修复此问题

我同意 cookie 应该与存储在会话中的会话时间一起更新。然而,PHP 的会话处理内部功能并不是这样工作的。似乎有几种不同的方法可以解决此问题。

由于这将改变当前的行为(尽管它可能很奇怪),但修复被推迟到 2.3 版。

我认为在 PHP 之外管理 cookie 状态将是最合适的解决方案。不过,我不知道这对于现有应用程序的更改有多安全。改变会话的工作方式可能会发生巨大的变化,并且允许用户保持更长时间的登录可能不是所有开发人员所期望的。

于 2012-07-19T10:07:40.080 回答
3

这似乎是 PHP 处理会话的方式。PHP 不会在每个请求上更新 cookie(参见: http: //php.net/manual/en/function.session-set-cookie-params.php#100672)。CakePHP 不依赖此 cookie 中的到期时间,而是将当前时间与Session::_validAgentAndTime().

于 2012-07-16T14:38:55.060 回答
0

这个问题可以通过结合使用这两个参数来解决。

Configure::write('Session', array(
    'cookie' => 'CAKEPHP',
    'defaults' => 'php',
    'timeout' => 60,                // 60 minutes: Actual Session Timeout
    'cookieTimeout' => 1440,        // 1440 minutes: 24 hrs: Actual Cookie Timeout
    'autoRegenerate' => true,
    'requestCountdown' => 1,
    'checkAgent' => false,
));
  • autoRegenerate : 刷新后生成 Session Cookie。重新生成会话 Cookie 的刷新计数由下一个参数确定。
  • requestCountdown : 保持这个参数的值尽可能低。这是刷新/重新加载的次数,之后会话 Cookie 将重新生成。
于 2019-04-22T03:45:51.310 回答