我在其他地方研究的内容
this question中的答案解释了只要用户处于活动状态,如何使用autoRegenerate和requestCountdown来延长会话。
This question有一个答案解释ajax调用会发生什么:
如果您停留在同一页面上,JavaScript会发出请求,生成新的session_id,并且不会记录新的session_id。
所有后续的ajax请求都使用旧的session_id,它被声明为无效,并返回一个空的会话。
其他地方据说有些浏览器发送另一个带有ajax请求的userAgent,如果必须保证ajax调用有效,则必须将Session.checkAgent设置为false。但由于那些ajax调用有时失败,我不认为这就是问题的原因。
我的问题是
我已将requestCountdown设置为1,但随后在页面加载时自动执行ajax请求的页面上收到错误。我将requestCountdown增加到4,这在大多数情况下都应该足够了。但是某些浏览器的某些用户会收到错误消息,因为一个或多个ajax调用会收到“403 Forbidden”作为响应。对于同一页面,有时会出现错误,有时则不会出现错误。
我想要的是如果会话长度是例如30分钟,用户打开一个页面(或触发一个导致ajax呼叫的事件),让我们说第29分钟,会话应再延长30分钟。
但我似乎陷入了两个问题:
我的问题
确保我理解正确:会话不能简单地延长,必须“重新生成”,这意味着会话ID被更改了?
也许这在概念上都是正确的,但我想知道我是否只是缺少一个额外的设置或某些东西让它起作用?
示例性请求和响应标头(来自我的测试计算机)
Request
-------
POST /proxies/refreshProxiesList/0 HTTP/1.1
Host: localhost:84
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Referer: http://localhost:84/users/home
Cookie: CakeCookie[lang]=de; CAKEPHP=b4o4ik71rven5478te1e0asjc6
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 0
Response
--------
HTTP/1.1 403 Forbidden
Date: Tue, 18 Feb 2014 10:24:52 GMT
Server: Apache/2.4.4 (Win32) OpenSSL/1.0.1e PHP/5.5.3
X-Powered-By: PHP/5.5.3
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
答案 0 :(得分:0)
CakePHP使用带cookie的会话。听起来像问题的是,虽然会话本身可以通过超时选项延长,但会话cookie不能轻易延长,所以最终会失去你的会话。该线程中的人员建议刷新会话以便创建新的cookie。
正如一个人建议的那样,你可以延长会话cookie的寿命,虽然问题仍然存在,但它不会那么明显。也许你可以自己写一些东西以重新启动会话cookie并使用新的到期时间? ...虽然我没有发现人们这样做,但也许没有。
Google搜索有关cakephp和会话Cookie过期的信息,似乎这是一个已知的问题CakePHP Session updates but cookie expiry doesn't,人们为此做了变通办法。