Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 在什么情况下,AJAX请求不能由触发AJAX的页面设置cookies?_Http_Cookies_Session Cookies_Setcookie - Fatal编程技术网

Http 在什么情况下,AJAX请求不能由触发AJAX的页面设置cookies?

Http 在什么情况下,AJAX请求不能由触发AJAX的页面设置cookies?,http,cookies,session-cookies,setcookie,Http,Cookies,Session Cookies,Setcookie,从查看服务器日志(我无法在任何浏览器上重现这种情况)中推断出,在很小的一部分时间内,我们会看到这样的流: 当客户点击我们的页面时: 没有饼干 获取带有Set CookieHTTP响应头的响应,该响应头为会话id B body让JS发出AJAX请求/AJAX/foo 在+1秒的时间内,客户端向我们发出AJAX请求,请求/AJAX/foo 正如预期的那样,referer被设置为步骤1中触发AJAX的页面 没有饼干-为什么 获取一个带有Set Cookie头的响应,该头为他们提供了一个会话id

从查看服务器日志(我无法在任何浏览器上重现这种情况)中推断出,在很小的一部分时间内,我们会看到这样的流:

  • 当客户点击我们的页面时:

    • 没有饼干
    • 获取带有
      Set Cookie
      HTTP响应头的响应,该响应头为会话id B
    • body让JS发出AJAX请求
      /AJAX/foo
  • 在+1秒的时间内,客户端向我们发出AJAX请求,请求
    /AJAX/foo

    • 正如预期的那样,referer被设置为步骤1中触发AJAX的页面
    • 没有饼干-为什么
    • 获取一个带有
      Set Cookie
      头的响应,该头为他们提供了一个会话id C(应为C,因为他们没有向我们发送Cookie)
  • 稍晚一点,所有客户端请求都会发送会话id B或C,因此问题不在于浏览器关闭了cookie

  • 这似乎本质上是一种竞争条件——主页请求和AJAX请求在时间上非常接近,两者都没有cookie,并且存在设置cookie的竞争。一胜一负

    令我困惑的是,这怎么会发生?我的假设是,当浏览器已经阅读了足够多的响应,知道它需要触发AJAX请求时,它已经收到HTTP响应头,从而收到
    Set-Cookie
    响应头。因此,在我看来,客户端总是会发回我们在激发AJAX请求的页面中设置的cookie。除非浏览器没有及时处理
    Set Cookie
    响应,否则我看不出这是怎么回事


    正如我所说,我无法在Firefox、Safari或Chrome中重现这一点,但我们每天都会看到好几次。google Chrome中有一个新功能可能会导致这种错误行为。它被称为预渲染

    预渲染是Chrome(13及以上版本)中的一项实验性功能 这可以从网站作者那里得到提示,以加快浏览速度 用户体验。网站作者在HTML中包含一个元素 指示Chrome提前获取并呈现附加页面 用户实际单击它

    即使您自己没有主动触发预渲染,它也是 仍然有可能其他网站会指示Chrome进行预渲染 你的网站。如果您的页面正在预呈现,它可能会,也可能永远不会 显示给用户(取决于用户是否单击链接)。在里面 绝大多数情况下,你不应该做任何特殊的事情 要处理预呈现的页面,它应该可以正常工作

    欲了解更多信息,请阅读:

    编辑:
    您可以通过以下命令触发页面上的预呈现:

    a)cookie是否有过期时间

    b) 如果是这样的话,您是否尝试过通过将计算机的时钟向后或向前设置超过cookie的TTL来复制它?(很明显,我指的是运行浏览器的计算机的时钟,而不是运行应用程序的服务器……应用程序应该是一台时钟设置准确的独立计算机。)


    我也看到了这一点;它似乎是由系统时钟出错的用户触发的。从浏览器的角度来看,发送的cookie的过期日期已经过了。

    这是一个非常好的主意,谢谢,但我不这么认为,因为我在一堆不同的用户代理中看到过它,它们不是Chrome。这是一个有趣的想法。谢谢后来我换了公司,所以这个问题不再出现在我的雷达上,但如果我看到类似的问题,我可能会在以后的某个时候再提到这个问题。再次感谢!