我知道以前曾以各种形式提出过这个问题,但我似乎无法解决这个问题。我尝试使用 jQuery 和本机 JS API 来发出 Ajax 请求。
我的情况如下(见附图):
- 浏览器发出 HTTP 请求
- 服务器响应并设置持久 Cookie
- 浏览器发出 HTTP Ajax 请求,Cookie 存在就好
- 服务器按预期响应,更新 Cookie
- 浏览器发出 HTTPS Ajax 请求,Cookie 不再存在(?!)
- 服务器给出“默认”响应,因为没有 Cookie(意外行为)
在任何人开始关于跨域请求的讲座之前,让我先声明几件事:
- 我知道这是一个跨域请求(不同的协议),这就是服务器
Access-Control-Allow-Origin
在响应中设置标头的原因(我使用的是 Chrome 和 Firefox,两者都支持CORS) - 不过,我还知道 HTTP cookie 应该可以通过 HTTPS 进行管理(请参阅此处),因为主机是相同的
- (编辑)为通用域(例如 .domain.ext)正确设置了 cookie,并且既没有设置 HttpOnly 也没有设置 Secure 标志
那么,为什么,为什么,为什么浏览器在进行 HTTPS Ajax 调用时不传递 cookie?有任何想法吗?我快要失去理智了……
+-----------+ HTTP Request +-----------+
|Browser |+---------------->|Server |
+-----------+ +-----------+
HTTP Response
<----------------+
Set-cookie
Ajax HTTP Req.
+---------------->
Cookie (OK)
HTTP Response
<----------------+
Set-cookie (OK)
Ajax HTTPS Req.
+---------------->
No Cookie (!!!)