[英]Cross domain POST request is not sending cookie Ajax Jquery
似乎已经在 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。
您无法通过 JavaScript 在 CORS 请求上设置或读取 cookie。 尽管 CORS 允许跨域请求,但 cookie 仍受浏览器的同源策略约束,这意味着只有来自同一源的页面才能读取/写入 cookie。 withCredentials
仅意味着远程主机设置的任何 cookie 都会发送到该远程主机。 您必须使用Set-Cookie
标头从远程服务器Set-Cookie
。
请注意,这并不能解决 cookie 共享过程,因为通常这是不好的做法。
您需要使用 JSONP 作为您的类型:
来自 $.ajax 文档:跨域请求和数据类型:“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);
}
}
);
这个领域最近发生了许多变化,所以我认为一个新的答案会有所帮助。
要在请求期间让浏览器将 cookie 发送到另一个站点,必须满足以下条件:
Set-Cookie
标头必须包含SameSite=None
和Secure
标签。 如果未使用Secure
, SameSite
忽略SameSite
标头。https
端点发出请求,这是Secure
标志的要求。XHRRequest
必须使用withCredentials=true
。 如果使用$.ajax()
这是通过xhrFields
参数完成的(需要jQuery=1.5.1+
)Origin
标头匹配的Access-Control-Allow-Origin
标头进行响应。 ( *
在这种情况下不会被尊重)很多人找到了这篇文章的方法,试图针对远程端点进行本地开发,如果满足上述条件,这是可能的。
我有同样的问题。 会话 ID 在 cookie 中发送,但由于请求是跨域的,浏览器的安全设置将阻止发送 cookie。
解决方案:在客户端(在浏览器中)生成会话 ID,使用 Javascript sessionStorage 存储会话 ID,然后将会话 ID 与每个请求一起发送到服务器。
我在这个问题上挣扎了很多,周围没有很多好的答案。 这是一篇详细介绍解决方案的文章: Javascript Cross-Domain Request With Session
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.