【问题标题】:In what scenario could an AJAX request not have the cookies set by the page which fired the AJAX?在什么情况下,AJAX 请求可能没有触发 AJAX 的页面设置的 cookie?
【发布时间】:2012-03-01 04:15:09
【问题描述】:

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

  1. 在时间 A,客户点击我们的页面:

    • 没有 cookie
    • 返回带有Set-Cookie HTTP 响应标头的响应,该响应标头为它们提供 B 的会话 ID
    • body 有 JS 来触发 AJAX 请求 /ajax/foo
  2. 在时间 A + 1 秒,客户端向我们发送 AJAX 请求到 /ajax/foo

    • 在第 1 步中将引用设置为触发 AJAX 的页面,正如预期的那样
    • 没有 cookie - 为什么?
    • 返回带有 Set-Cookie 标头的响应,该标头为他们提供 C 的会话 ID(预期,因为他们没有向我们发送 cookie)
  3. 稍晚一点,所有客户端请求都发送会话 ID B 或 C - 所以问题不是浏览器关闭了 cookie。

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

让我感到困惑的是,这怎么会发生?我的假设是,当浏览器读取足够多的响应以知道它需要触发 AJAX 请求时,它已经收到了 HTTP 响应标头,因此也收到了 Set-Cookie 响应标头。所以在我看来,客户端总是会发回我们在触发 AJAX 请求的页面中设置的 cookie。我只是不明白这是怎么发生的,除非浏览器没有及时处理Set-Cookie 响应。

就像我说的,我无法在 Firefox、Safari 或 Chrome 中重现这种情况,但我们确实每天都会看到几次。

【问题讨论】:

    标签: http cookies session-cookies setcookie


    【解决方案1】:

    谷歌浏览器中有一个新功能可能会导致这种不当行为。它被称为预渲染。

    预渲染是 Chrome 中的一项实验性功能(版本 13 及更高版本) 可以从网站作者那里获取提示以加快浏览速度 用户的体验。网站作者在 HTML 中包含一个元素 指示 Chrome 在 用户实际点击它。

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

    更多信息请阅读:http://code.google.com/chrome/whitepapers/prerender.html

    编辑:
    你可以在你的页面上触发预渲染:http://prerender-test.appspot.com/

    【讨论】:

    • 这是个好主意,谢谢,但我不认为就是这样,因为我在一堆不同的用户代理(不是 Chrome)上看到过。
    【解决方案2】:

    a) cookie 是否有过期时间?

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

    我也见过这个;它似乎是由搞砸系统时钟的用户触发的。从浏览器的角度来看,发送的 cookie 带有过期日期。

    【讨论】:

    • 这是一个有趣的想法。谢谢!我已经换了公司,所以这个问题不再在我的雷达上,但如果我看到类似的问题,我可能会在稍后的某个时间再提及这个问题。再次感谢!
    猜你喜欢
    • 2018-06-23
    • 2015-11-08
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多