【发布时间】:2012-03-01 04:15:09
【问题描述】:
在一小部分时间里,我们看到这样的流程,从查看服务器日志中推断出来(我无法用任何浏览器重现这种情况):
-
在时间 A,客户点击我们的页面:
- 没有 cookie
- 返回带有
Set-CookieHTTP 响应标头的响应,该响应标头为它们提供 B 的会话 ID - body 有 JS 来触发 AJAX 请求
/ajax/foo。
-
在时间 A + 1 秒,客户端向我们发送 AJAX 请求到
/ajax/foo- 在第 1 步中将引用设置为触发 AJAX 的页面,正如预期的那样
- 没有 cookie - 为什么?
- 返回带有
Set-Cookie标头的响应,该标头为他们提供 C 的会话 ID(预期,因为他们没有向我们发送 cookie)
-
稍晚一点,所有客户端请求都发送会话 ID B 或 C - 所以问题不是浏览器关闭了 cookie。
这似乎本质上是一种竞争条件——主页请求和 AJAX 请求在时间上非常接近,两者都没有 cookie,并且存在设置 cookie 的竞争。一胜一负。
让我感到困惑的是,这怎么会发生?我的假设是,当浏览器读取足够多的响应以知道它需要触发 AJAX 请求时,它已经收到了 HTTP 响应标头,因此也收到了 Set-Cookie 响应标头。所以在我看来,客户端总是会发回我们在触发 AJAX 请求的页面中设置的 cookie。我只是不明白这是怎么发生的,除非浏览器没有及时处理Set-Cookie 响应。
就像我说的,我无法在 Firefox、Safari 或 Chrome 中重现这种情况,但我们确实每天都会看到几次。
【问题讨论】:
标签: http cookies session-cookies setcookie