CakePHP:session,autoRegenerate,requestCountdown,AJAX的问题

时间:2014-02-14 16:58:35

标签: ajax cakephp

我在其他地方研究的内容

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分钟。

但我似乎陷入了两个问题:

  1. 如果倒计时设置为大于1的值并且用户碰巧访问不包含任何ajax请求的页面,则倒计时值仅减少1,它不会变为0,并且会话没有重生。例如。如果倒计时设置为10,则用户必须单击10次才能重新生成会话。
  2. 如果倒计时设置为1,则每次请求都会重新生成会话,但在某些浏览器上,有时某些ajax调用会失败。
  3. 我的问题

    确保我理解正确:会话不能简单地延长,必须“重新生成”,这意味着会话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
    

1 个答案:

答案 0 :(得分:0)

CakePHP使用带cookie的会话。听起来像问题的是,虽然会话本身可以通过超时选项延长,但会话cookie不能轻易延长,所以最终会失去你的会话。该线程中的人员建议刷新会话以便创建新的cookie。

正如一个人建议的那样,你可以延长会话cookie的寿命,虽然问题仍然存在,但它不会那么明显。也许你可以自己写一些东西以重新启动会话cookie并使用新的到期时间? ...虽然我没有发现人们这样做,但也许没有。

Google搜索有关cakephp和会话Cookie过期的信息,似乎这是一个已知的问题CakePHP Session updates but cookie expiry doesn't,人们为此做了变通办法。