跨域POST请求不发送cookie Ajax Jquery

时间:2013-01-22 15:45:19

标签: javascript jquery ajax cookies 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);
      }
    }
);

我在请求HEADER中看不到这个cookie。

4 个答案:

答案 0 :(得分:61)

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

答案 1 :(得分: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);
      }
    }
);

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:6)

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

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

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