我在其他地方研究过的
这个问题的答案解释了只要用户处于活动状态,如何使用autoRegenerate和requestCountdown来延长会话时间.
这个问题的答案解释了ajax调用会发生什么:
如果您停留在同一页面上,JavaScript会发出请求,生成新的session_id,并且不会记录新的session_id.
所有后续的ajax请求都使用旧的session_id,该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
Run Code Online (Sandbox Code Playgroud)
CakePHP 使用带有 cookie 的会话。在我看来,问题在于,虽然会话本身可以通过超时选项延长,但会话 cookie 不能轻易延长,因此您最终会丢失会话。该线程中的人员建议刷新会话,以便创建新的 cookie。
正如一个人所建议的那样,您可以将会话 cookie 的寿命延长得更长,尽管问题仍然存在,只是不太明显。也许您可以自己写一些东西来用新的过期时间重新保存会话 cookie?...虽然我没有发现有人这样做,所以也许没有。
谷歌搜索有关 cakephp 和会话 cookie 过期的信息,这似乎是CakePHP 会话更新的一个已知问题,但人们并没有针对 cookie 过期制定解决方法。