CakePHP会话更新,但cookie到期不会

时间:2012-07-03 04:18:30

标签: session cakephp cookies session-cookies

简短问题:

为什么在服务器上更新会话的expirty时间后,我的会话cookie的到期时间是否在浏览器中得到更新?

长问题:

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

首先,在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分钟的窗口内,我回到我的应用程序并刷新页面。然后,我检查会话以查看它是否已更新。它针对会话ID 1341288122显示aqm0gkmjfsuqje019at8cgsrv3,其等于Tue, 03 Jul 2012 04:02:02 GMT,这也是我的预期。会话到期时间已更新为我上次重新加载页面后的1分钟。

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

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

3 个答案:

答案 0 :(得分:4)

你发现的问题确实是出乎意料的,并结束了他们应该活着的会议。

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

  

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

由于这会改变当前的行为(无论多么奇怪),修复程序推迟到2.3版本。

  

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

答案 1 :(得分:3)

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

答案 2 :(得分: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,
));
  • 自动重新生成:刷新后生成会话Cookie。刷新计数(应在该刷新计数之后重新生成会话Cookie)由下一个参数确定。
  • requestCountdown :将此参数的值保持尽可能低。这是刷新/重新加载的数量,会话cookie将在此数量之后重新生成。