【问题标题】:Cookies not sent in cross-origin jquery ajax request when custom header set设置自定义标头时未在跨域 jquery ajax 请求中发送 Cookie
【发布时间】:2016-02-21 20:26:31
【问题描述】:

我们正在使用 jQuery 从主域向子域(跨域)发出 ajax 请求。我们已经设置了 CORS,并且一切正常,直到我们尝试发送带有请求的自定义标头。如果在请求上设置了自定义标头,则我们的会话 cookie 不再随请求一起发送。

jQuery 版本:2.1.4

我们的源域:http://example.com

我们的会话 cookie 设置为供子域使用,在 cookie 选项中使用 domain : .example.com

CORS 标头随来自子域的响应一起发送:

 Access-Control-Allow-Origin : http://example.com
 Access-Control-Allow-Credentials : true
 Access-Control-Allow-Headers : Origin, X-Requested-With, Content-Type, Accept, X-OurCustomHeader

此请求工作正常(会话 cookie 随请求一起发送):

 jQuery.ajax({
       url: 'http://sub.example.com/someajaxroute',
       xhrFields: { withCredentials: true },
 }

此请求(带有自定义标头)不起作用(未发送会话 cookie):

 jQuery.ajax({
       url: 'http://sub.example.com/someajaxroute',
       xhrFields: { withCredentials: true },
       headers : { 'X-OurCustomHeader' : 'xxx'}
 }

有人知道为什么 jQuery/浏览器在第二个例子中没有发送 cookie 吗?


PS。我知道stackoverflow上有很多jquery CORS问题。我对它们进行了广泛的研究,但找不到能解决这个确切问题的方法。 请您仅在找到与此确切问题匹配的问题时才将其标记为重复。谢谢。

【问题讨论】:

  • 我不是 Ajax 专家,但您是否尝试过使用 beforeSend 设置自定义标头而不是使用 headers
  • 通过设置自定义标头,您的请求不仅仅是一个“简单”请求,这意味着它需要正确处理预检请求。您的服务器是否收到预检请求?预检请求不包含 cookie。对于预检请求,请求方法将是 OPTIONS 而不是 GET。如果预检失败,则不会发送实际请求。
  • @M.Doye - 谢谢,试过了,但没有区别
  • @KevinB - 对。我假设 OPTIONS 预检内容已经在(工作)第一种情况下发生。这听起来像是当时的主要嫌疑人。谢谢。我会调查并报告。
  • @UpTheCreek 可能是,具体取决于浏览器。在这种情况下,某些浏览器似乎对规范的解释与其他浏览器不同。浏览器控制台(或 fiddler2)将阐明这一点。

标签: javascript jquery ajax cors


【解决方案1】:

事实证明(正如@KevinB 建议的那样)这是我们服务器上处理预检选项的方式的问题,与客户端无关。谢谢凯文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2020-06-30
    • 2014-11-22
    • 2019-05-29
    相关资源
    最近更新 更多