【发布时间】:2014-03-14 03:47:01
【问题描述】:
我在别处研究的内容
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 分钟,用户在第 29 分钟打开一个页面(或触发一个导致 ajax 调用的事件),会话应该再延长 30 分钟。
但我似乎陷入了两个问题:
- 如果倒计时设置为大于 1 的值,并且用户碰巧访问了一个不包含任何 ajax 请求的页面,倒计时值仅减少 1,不会变为 0,并且会话没有再生。例如。如果倒计时设置为 10,则用户必须单击 10 次才能重新生成会话。
- 如果倒计时设置为 1,则每次请求都会重新生成会话,但在某些浏览器上,有时某些 ajax 调用会失败。
我的问题
为了确保我理解正确:会话不能简单地延长,它必须“重新生成”,这意味着会话 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
【问题讨论】:
-
在 CakePHP 的 core.php 文件中试试这个设置。 CakePHP Session Cookie Auto-Regenerate Issue