通过HTTPS的HTTP Cookie和Ajax请求

NeX*_*XuS 43 cookies ajax https http

我知道之前已经以各种形式提出过这个问题,但我似乎无法解决这个问题.我已经尝试使用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进行管理(参见此处),因为主机是相同的
  • (编辑)为一般域(例如.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 (!!!)
Run Code Online (Sandbox Code Playgroud)

NeX*_*XuS 72

好的,找到了cookie问题的解决方案.

请参阅XHR规范,jQuery文档StackOverflow.

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

例如(使用jQuery)

 $.ajax( {
   /* Setup the call */
   xhrFields: {
     withCredentials: true
   }
 });
Run Code Online (Sandbox Code Playgroud)

  • 真棒.你自己找到了答案.感谢分享.当人们找到答案而不分享时,这么多帖子.Kudos NeXuS. (3认同)