CakePHP:会话、autoRegenerate、requestCountdown、AJAX 的问题

Posted

技术标签:

【中文标题】CakePHP:会话、autoRegenerate、requestCountdown、AJAX 的问题【英文标题】:CakePHP: Problems with session, autoRegenerate, requestCountdown, AJAX 【发布时间】: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 【参考方案1】:

CakePHP 使用带有 cookie 的会话。在我看来,问题是虽然会话本身可以通过超时选项延长,但会话 cookie 不能轻易延长,所以无论如何你最终都会失去你的会话。该线程中的人建议刷新会话以创建新的 cookie。

正如一个人建议的那样,您可以将会话 cookie 的寿命延长得更长,尽管问题仍然存在,只是不太明显。也许你可以自己写一些东西来用新的过期时间重新保存会话 cookie? ...虽然我还没有发现有人提到这样做,所以也许不是。

在谷歌上搜索有关 cakephp 和会话 cookie 过期的信息,这似乎是一个已知问题CakePHP Session updates but cookie expiry doesn't,人们已经解决了这个问题。

【讨论】:

谢谢,但我认为这不是 cookie 问题。我将 cookie 生命周期设置为 2 小时,“会话超时”出现得更早。此外,当ajax请求得到403响应时,会话并没有真正超时。出现此类错误后,用户可以单击并打开另一个页面,会话仍然存在。一定是不一样的…… 状态 403?您可以发布请求/响应标头吗?它可以告诉我们更多。也是一个想法 - 请求倒计时,它不是也计算所有对资源的请求吗?缺少图像,插件资源,下次您体验时我会检查访问日志。是在所有主流浏览器上repro,你都做什么样的ajax调用? 请求倒计时:是的,我想是的。例如。 jQuery 源映射不在我们的服务器上,但由 Google Chrome 请求(除非在选项中禁用)。在一个有两个 ajax 调用的页面上,我看到第一个 ajax 调用已经产生了一个错误。在我将 Chrome 的设置更改为不使用源映射后,第一个 ajax 调用有效,但第二个产生了错误。这可能意味着对丢失文件的请求也会减少请求倒计时。 “它是 repo 吗?”:在 Google Chrome 中似乎比在 Firefox 中更常见。但是我们也发现了所有浏览器都会报错的情况(访问某个页面[没有错误],从那里通过点击链接进入另一个页面[没有错误],然后点击浏览器的返回按钮[所有浏览器都出错]) .后退按钮似乎特别成问题。 Ajax 请求使用 jQuery.ajax 完成,输入“POST”。

以上是关于CakePHP:会话、autoRegenerate、requestCountdown、AJAX 的问题的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP多个会话

具有两个模型会话的 Cakephp 身份验证组件

cakephp 3如何增加会话超时

在 cakephp 中延长每个用户的会话超时

如何在cakephp 2中查看会话变量?

PHP cakephp有奇怪的会话问题