【问题标题】:Cross domain POST request is not sending cookie Ajax Jquery跨域 POST 请求未发送 cookie Ajax Jquery
【发布时间】:2013-01-05 21:52:45
【问题描述】:

似乎在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 jquery ajax cookies cross-domain


【解决方案1】:

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

【讨论】:

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

请注意,这并不能解决 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);
      }
    }
);

【讨论】:

  • 谢谢@Justin Schuhmann 其实我确实需要提出 CORS 请求,而不是 JSONP。 CORS 不支持 cookie 传递吗?
  • 嗨,实际上使用 dataType: "text",对我来说就像一个魅力!谢谢!
  • 什么是不好的做法?在 CORS 请求中使用 cookie?如果是这样,为什么这是不好的做法?
  • @Mnebuerquo 对不起? cookie 共享是一种不好的做法,除非是针对子域。因为 cookie 不安全,所以只需通过 AJAX 调用发送必要的数据。除了将它们作为“安全”发送之外,我不知道您为什么要浪费时间。
  • 我明白了。我没有意识到 OP 试图将 cookie 发送到与设置它的域不同的域。能够将 cookie 发送到不同域的 Javascript 将启用各种会话劫持。理想情况下,你会让你的 cookie 只使用 http,这样 javascript 就根本无法触及它们。我第一次读到这个的时候一定在睡觉。谢谢!
【解决方案3】:

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

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

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

【讨论】:

  • 如果是 XMLHttpRequest(它添加了 X-Requested-With 标头),您可能还需要将 Access-Control-Allow-Headers 设置为 X-Requested-With 服务器端,否则 CORS 策略可能会阻止请求
【解决方案4】:

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

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

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

【讨论】:

  • 这个解决方案安全吗?我觉得它存在安全漏洞。我不确定是否建议将会话 ID 存储在 sessionStorage 中
  • 这种方法不适用于无服务器类型的应用程序,其中 jwt 令牌用作 cookie...
  • 在存储中存储会话 ID 会破坏交换无法从 javascript 访问的安全 cookie 的整个安全措施
猜你喜欢
  • 2020-06-30
  • 2016-07-25
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2015-12-21
  • 2016-10-02
相关资源
最近更新 更多