通过 HTTPS 的 HTTP Cookie 和 Ajax 请求
Posted
技术标签:
【中文标题】通过 HTTPS 的 HTTP Cookie 和 Ajax 请求【英文标题】:HTTP Cookies and Ajax requests over HTTPS 【发布时间】: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
标志。这至少是一个不错的起点。
***.com/questions/5441836/… 看起来这是一个故意的限制。
谢谢,我已经读过了,但一点帮助都没有。首先,它说 https cookie 是加密的,这仅在传输过程中是正确的(否则浏览器将无法访问其数据)。给出的解释也违反了 cookie 规范,AFAIK。
【参考方案1】:
好的,找到cookie问题的解决方案了。
请参阅XHR specs、jQuery docs 和 ***。
在切换协议和/或子域时发送 cookie 的解决方案是将 withCredentials
属性设置为 true
。
例如(使用 jQuery)
$.ajax(
/* Setup the call */
xhrFields:
withCredentials: true
);
【讨论】:
太棒了。你自己找到了答案。感谢分享。当人们找到答案并且不分享时,会有很多帖子。荣誉 NeXuS。 不幸的是我仍然无法让它工作......:D 谢谢,经过 2 天的尝试找出原因后,这对我有用【参考方案2】:Document.cookie 和 Ajax Request 不共享 cookie。否则,ajax 无法从 document.cookie 或响应标头访问 cookie。它们只能由远程域控制。
如果您首先通过 ajax 从服务器获得包含 cookie 的响应,那么您可以请求通过 cookie 与服务器进行 ajax 通信。
对于这种情况,您可以编写如下代码(jQuery)
$.ajax(
xhrFields :
withCredentials : true
);
见this article和demo
【讨论】:
以上是关于通过 HTTPS 的 HTTP Cookie 和 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章
强制 Tomcat 通过 http 使用安全的 JSESSIONID cookie