简短问题:
为什么在服务器上更新会话的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不会在浏览器中使用新的到期日期更新?
答案 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,
));