69

似乎在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

4 回答 4

74

您不能通过 JavaScript 设置或读取 CORS 请求的 cookie。虽然 CORS 允许跨域请求,但 cookie 仍然受制于浏览器的同源策略,这意味着只有来自同源的页面才能读取/写入 cookie。withCredentials仅表示将远程主机设置的任何 cookie 发送到该远程主机。您必须使用Set-Cookie标头从远程服务器设置 cookie。

于 2013-01-23T04:31:25.347 回答
23

请注意,这并不能解决 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);
      }
    }
);
于 2013-01-22T15:54:52.780 回答
20

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

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

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

于 2020-03-27T19:16:46.480 回答
4

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

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

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

于 2014-12-04T12:28:39.577 回答