【发布时间】: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