似乎已经在stackoverflow上讨论了类似的东西,但我找不到完全相同的东西。
我正在尝试使用CORS(跨源资源共享)发送Cookie,但它无法正常工作。
这是我的代码。
$.ajax(
{
type: "POST",
url: "http://example.com/api/getlist.json",
dataType: 'json',
xhrFields: {
withCredentials: true
},
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
},
success: function(){
alert('success');
},
error: function (xhr) {
alert(xhr.responseText);
}
}
);
我在请求HEADER中看不到这个cookie。
答案 0 :(得分:61)
您无法通过JavaScript在CORS请求中设置或读取Cookie。虽然CORS允许跨源请求,但cookie仍然受浏览器的同源策略的约束,这意味着只有来自同一来源的页面才能读/写cookie。 withCredentials
仅表示远程主机设置的任何cookie都发送到该远程主机。您必须使用Set-Cookie
标题从远程服务器设置cookie。
答案 1 :(得分:20)
请注意,这并不能解决cookie共享过程,因为通常这是不好的做法。
您需要使用JSONP作为您的类型:
来自$ .ajax文档: 跨域请求和dataType:“jsonp”请求不支持同步操作。
$.ajax(
{
type: "POST",
url: "http://example.com/api/getlist.json",
dataType: 'jsonp',
xhrFields: {
withCredentials: true
},
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
},
success: function(){
alert('success');
},
error: function (xhr) {
alert(xhr.responseText);
}
}
);
答案 2 :(得分:9)
在这个领域,最近有很多变化,所以我认为一个新的答案会有所帮助。
要使浏览器在请求期间将cookie发送到另一个站点,必须满足以下条件:
Set-Cookie
header from the target site must contain the SameSite=None
and Secure
labels.如果未使用Secure
,则SameSite
标头将被忽略。https
端点发出请求,这是Secure
标志的要求。XHRRequest
必须用withCredentials=true
制成。如果使用$.ajax()
this is accomplished with the xhrFields
parameter(需要jQuery=1.5.1+
)Access-Control-Allow-Origin
头匹配的Origin
头进行响应。 (在这种情况下,*
将不受尊重)很多人找到了尝试对远程端点进行本地开发的方法,如果满足上述条件,这是可能的。
答案 3 :(得分:6)
我有同样的问题。会话ID在cookie中发送,但由于请求是跨域的,因此浏览器的安全设置将阻止cookie被发送。
解决方案:在客户端(在浏览器中)生成会话ID,使用Javascript sessionStorage存储会话ID,然后将每个请求的会话ID发送到服务器。
我在这个问题上遇到了很多困难,周围没有很多好的答案。这是一篇详细介绍解决方案的文章:Javascript Cross-Domain Request With Session