2012-04-19 149 views
40

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

我的情况是下面(见附图):

  1. 浏览器发出HTTP请求
  2. 服务器响应,并设置永久性的Cookie
  3. 浏览器发出HTTP Ajax请求,饼干是有正常的
  4. 服务器按预期响应,更新Cookie
  5. 浏览器发出HTTPS Ajax请求,Cookie不再存在(?!)
  6. Server为“默认”的响应,因为没有曲奇(意外情况)

任何人之前开始对跨域请求的讲座让我说出一两件事情:

  • 我知道,这是一个跨域请求(不同的协议),这就是为什么服务器在响应中设置Access-Control-Allow-Origin标题(并且我使用的是Chrome和Firefox,两者都支持CORS
  • 但我也知道HTTP cookie应该可以通过HTTPS进行管理(请参阅here)因为主机是相同的
  • (编辑)正确设置cookie为一般域(例如, .domain.ext)和既不是仅Http也使得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 (!!!) 
+0

捕捉HTTP请求转储,并检查是否'仅HTTP任何'secure'的和在Set-Cookie语句中设置标志。那至少是一个好起点。 – dpq 2012-04-19 15:19:24

+0

都没有设置。 – NeXuS 2012-04-20 01:41:32

+0

http://stackoverflow.com/questions/5441836/jquery-cookie-values-not-maintained-while-moving-from-http-to-https看起来像这是一个故意的限制。 – dpq 2012-04-20 09:49:38

回答

66

好的,找到了解决cookie问题的方法。

请参阅XHR specs,jQuery docsStackOverflow

切换协议和/或子域时发送cookie的解决方案是将withCredentials属性设置为true

E.g. (使用jQuery)

$.ajax({ 
    /* Setup the call */ 
    xhrFields: { 
    withCredentials: true 
    } 
}); 
+2

太棒了。你自己找到了答案。感谢分享。如此多的帖子,当人们找到答案,不共享。荣誉NeXuS。 – FernandoZ 2014-11-07 02:57:33

+0

不幸的是,我仍然无法使它工作...... D – NeXuS 2014-11-08 13:27:22

+0

谢谢,这为我工作了两天后,试图找出原因 – 2014-11-28 20:46:09

0

Document.cookie和Ajax Request不共享cookie。否则,ajax无法从document.cookie或响应头中访问cookie。它们只能由远程域控制。

如果您首先通过ajax从服务器获取包括cookie的响应,那么您可以向服务器请求与cookie进行ajax通信。

对于这种情况,可以编写如下面的代码(jQuery的)

$.jajx({ 
     xhrFields : { 
      withCredentials : true 
     } 
    }); 

参见this articledemo