通过HTTPS的HTTP Cookie和Ajax请求
我知道这已经以各种forms提出过,但我似乎无法解决这个问题。 我曾尝试使用jQuery和本机JS API来发出Ajax请求。
我的情况如下(见附图):
- 浏览器发出HTTP请求
- 服务器响应并设置持久Cookie
- 浏览器发出HTTP Ajax请求,Cookie是没有问题的
- 服务器按预期响应,更新Cookie
- 浏览器发出HTTPS Ajax请求,Cookie不再存在(?!)
- 服务器提供“默认”响应,因为没有Cookie(意外的行为)
在任何人开始就跨域请求进行演讲之前,请让我列举几件事情:
- 我知道这是一个跨域请求(不同的协议),这就是为什么服务器在响应中设置了
Access-Control-Allow-Origin
标头(我使用的是Chrome和Firefox,两者都支持CORS ) - 但是我也知道,HTTP cookie应该可以通过HTTPS进行pipe理(参见这里 ),因为主机是相同的
- (编辑)正确设置为一般域的cookie(例如.domain.ext),并没有设置HttpOnly和安全标志
那么,为什么呢,为什么呢,为什么浏览器在进行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 (!!!)
好的,find了cookie问题的解决scheme。
请参阅XHR规范 , jQuery文档和StackOverflow 。
切换协议和/或子域名时发送cookie的解决scheme是将withCredentials
属性设置为true
。
例如(使用jQuery)
$.ajax( { /* Setup the call */ xhrFields: { withCredentials: true } });
Document.cookie和Ajax请求不共享cookie。 否则,ajax将无法从document.cookie或响应头中访问cookie。 它们只能由远程域控制。
如果你第一次得到响应包括来自服务器的cookie由ajax,因为你可以请求与cookie的Ajax通信到服务器。
对于这种情况,你写如下面的代码(jQuery)
$.jajx({ xhrFields : { withCredentials : true } });
看到这篇文章和演示