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

问题描述 投票:4回答:3

简短问题:

当我的会话的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分钟的窗口内,我回到我的应用程序并刷新页面。然后,我检查会话以查看它是否已更新。它显示1341288122反对会话id 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,即使旧的仍然在技术上有效。

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

session cakephp cookies session-cookies
3个回答
4
投票

你发现的问题确实是意料之外的,并结束他们应该活着的会话。

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

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

因为这会改变当前的行为(不管它有多么奇怪),但修复程序被推迟到2.3版本。

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


3
投票

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


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重新生成之后的刷新/重新加载次数。
© www.soinside.com 2019 - 2024. All rights reserved.