简短问题:
当我的会话的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不会在浏览器中使用新的到期日期更新?
你发现的问题确实是意料之外的,并结束他们应该活着的会话。
这是CakePHP如何使用PHP的Session函数的结果。在CakePHP bugtracker中有一个条目(#3047),其中Mark Story(CakePHP开发人员)agrees应该修复
我同意cookie应该与会话中存储的会话时间一起更新。但是,这不是PHP的会话处理内部功能的工作方式。似乎有几种不同的方法可以解决此问题。
因为这会改变当前的行为(不管它有多么奇怪),但修复程序被推迟到2.3版本。
我认为在PHP之外管理cookie状态将是最合适的解决方案。我不知道这对现有应用程序的改变有多安全。改变会话的工作方式可能会发生巨大变化,并且允许用户长时间保持记录,这可能不是所有开发人员所期望的。
这似乎是PHP处理会话的方式。 PHP不会在每个请求上更新cookie(请参阅:http://php.net/manual/en/function.session-set-cookie-params.php#100672)。 CakePHP不是依赖此cookie中的到期时间,而是将当前时间与Session::_validAgentAndTime()
中的实际会话超时进行比较。
通过组合使用这两个参数可以解决该问题。
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,
));