跨域POST请求不发送cookie Ajax Jquery

IT技术 javascript jquery ajax cookies cross-domain
2021-01-16 22:45:12

似乎已经在 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。

4个回答

您无法通过 JavaScript 在 CORS 请求上设置或读取 cookie。尽管 CORS 允许跨域请求,但 cookie 仍受浏览器的同源策略约束,这意味着只有来自同一源的页面才能读取/写入 cookie。withCredentialsonly 意味着远程主机设置的任何 cookie 都会发送到该远程主机。您必须使用Set-Cookie标头从远程服务器设置 cookie

这真的很奇怪。为什么我不能在 Header 中传递 cookie?
2021-03-18 22:45:12
谢谢大家。这里好像不用讨论了。
2021-03-18 22:45:12
那么我们如何Set-Cookie在发出请求的服务器/客户端上设置它们呢?
2021-03-19 22:45:12
尽管 CORS 允许跨域请求,但 cookie 仍受浏览器的同源策略约束,这意味着只有来自同一源的页面才能读取/写入 cookie。
2021-03-30 22:45:12
cookie 会自动设置,但无法被您发送 cors 请求的网页读取,因为它位于另一个域中。如果您发出另一个 cors 请求,浏览器将自动将 cookie 附加到请求中(如果 withCredentials 设置为 true !!)。与普通 ajax 请求唯一不同的是,您无法使用 JavaScript 读取 cookie 内容。
2021-04-12 22:45:12

请注意,这并不能解决 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);
      }
    }
);
@Mnebuerquo 对不起?cookie 共享是一种不好的做法,除非它是子域。因为 cookie 不安全,所以只需通过 AJAX 调用发送必要的数据。除了将它们作为“安全”发送之外,我不知道您为什么要在 thme 上浪费时间。
2021-03-28 22:45:12
谢谢@Justin Schuhmann 实际上我确实需要发出 CORS 请求,而不是 JSONP。CORS 不支持 cookie 传递吗?
2021-04-08 22:45:12
什么是不好的做法?在 CORS 请求中使用 cookie?如果是这样,为什么这是不好的做法?
2021-04-08 22:45:12
我知道了。我没有意识到 OP 试图将 cookie 发送到与设置它不同的域。能够将 cookie 发送到不同域的 Javascript 将启用各种会话劫持。理想情况下,您会将 cookie 设为 http-only,这样 javascript 就根本无法访问它们。当我第一次读到这篇文章时,我一定是在睡觉。谢谢!
2021-04-10 22:45:12
嗨,实际上使用 dataType: "text",对我来说就像一个魅力!谢谢!
2021-04-12 22:45:12

这个领域最近发生了许多变化,所以我认为一个新的答案会有所帮助。

要在请求期间让浏览器将 cookie 发送到另一个站点,必须满足以下条件:

很多人找到了这篇文章的方法,试图针对远程端点进行本地开发,如果满足上述标准,这是可能的。

如果是 XMLHttpRequest(添加X-Requested-With标头),您可能还需要将其设置Access-Control-Allow-HeadersX-Requested-With服务器端,否则 CORS 策略可能会阻止请求
2021-03-28 22:45:12

我有同样的问题。会话 ID 在 cookie 中发送,但由于请求是跨域的,浏览器的安全设置将阻止发送 cookie。

解决方案:在客户端(在浏览器中)生成会话 ID,使用 Javascript sessionStorage 存储会话 ID,然后将会话 ID 与每个请求一起发送到服务器。

我在这个问题上挣扎了很多,周围没有很多好的答案。这是一篇详细介绍解决方案的文章:Javascript Cross-Domain Request With Session

将会话 id 存储在存储中会终止交换无法从 javascript 访问的安全 cookie 的整个安全措施
2021-03-27 22:45:12
这种方法不适用于无服务器类型的应用程序,其中 jwt 令牌用作 cookie...
2021-04-03 22:45:12
这个解决方案安全吗?我觉得它有一个安全漏洞。我不确定是否建议将会话 ID 存储在 sessionStorage 中
2021-04-08 22:45:12