跨域POST请求不发送cookie Ajax Jquery

Kir*_*eva 59 javascript cookies ajax jquery cross-domain

似乎已经在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);
      }
    }
);
Run Code Online (Sandbox Code Playgroud)

我没有在请求HEADER中看到这个cookie.

mon*_*sur 63

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

  • Cookie会自动设置,但是您发送cors请求的网页无法读取,因为它位于其他域中.如果你发出另一个cors请求,浏览器会自动将cookie附加到请求中(如果withCredentials设置为true !!).唯一与普通的ajax请求不同的是,你无法用JavaScript读取cookie内容. (8认同)
  • 虽然CORS允许跨源请求,但cookie仍然受浏览器的同源策略的约束,这意味着只有来自同一源的页面才能读/写cookie. (4认同)

abc*_*123 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);
      }
    }
);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Justin Schuhmann其实我确实需要提出CORS请求,而不是JSONP.CORS不支持cookie传递吗? (2认同)
  • 我知道了.我没有意识到OP试图将cookie发送到不同于设置它的域.能够将cookie发送到不同域的Javascript将启用各种会话劫持.理想情况下,您只能将您的cookie设为http-only,因此javascript根本无法触及它们.我第一次读这篇文章时一定是在睡觉.谢谢! (2认同)

mea*_*ppl 19

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

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

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

  • 如果是 XMLHttpRequest(添加了“X-Requested-With”标头),您可能还需要将“Access-Control-Allow-Headers”设置为“X-Requested-With”服务器端,否则 CORS 策略可能会阻止该请求 (2认同)

Per*_*ian 6

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

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

我在这个问题上遇到了很多困难,周围的答案并不多.这是一篇详细介绍解决方案的文章:带有Session的Javascript跨域请求