【发布时间】:2012-05-01 02:25:47
【问题描述】:
我知道以前曾以各种形式提出过这个问题,但我似乎无法解决这个问题。 我尝试过使用 jQuery 和原生 JS API 来发出 Ajax 请求。
我的情况如下(见附图):
- 浏览器发出 HTTP 请求
- 服务器响应并设置持久性 Cookie
- 浏览器发出 HTTP Ajax 请求,Cookie 就在那里
- 服务器按预期响应,更新 Cookie
- 浏览器发出 HTTPS Ajax 请求,Cookie 不再存在 (?!)
- 服务器给出“默认”响应,因为没有 Cookie(意外行为)
在任何人开始关于跨域请求的讲座之前,让我先声明几件事:
- 我知道这是一个跨域请求(不同的协议),这就是为什么服务器在响应中设置
Access-Control-Allow-Origin标头(我使用的是Chrome和Firefox,两者都支持CORS) - 不过,我还知道 HTTP cookie 应该可以通过 HTTPS 进行管理(请参阅 here),因为主机是相同的
- (编辑)为通用域(例如 .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 (!!!)
【问题讨论】:
-
捕获 HTTP 请求转储并检查
Set-Cookie语句中是否设置了任何secure和http-only标志。这至少是一个不错的起点。 -
stackoverflow.com/questions/5441836/… 看起来这是一个故意的限制。
-
谢谢,我已经读过了,但一点帮助都没有。首先,它说 https cookie 是加密的,这仅在传输过程中是正确的(否则浏览器将无法访问其数据)。给出的解释也违反了 cookie 规范,AFAIK。