通过HTTPS的HTTP Cookie和Ajax请求

我知道这已经以各种forms提出过,但我似乎无法解决这个问题。 我曾尝试使用jQuery和本机JS API来发出Ajax请求。

我的情况如下(见附图):

  1. 浏览器发出HTTP请求
  2. 服务器响应并设置持久Cookie
  3. 浏览器发出HTTP Ajax请求,Cookie是没有问题的
  4. 服务器按预期响应,更新Cookie
  5. 浏览器发出HTTPS Ajax请求,Cookie不再存在(?!)
  6. 服务器提供“默认”响应,因为没有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 } }); 

看到这篇文章和演示