48

$.ajax在同一个域上有一个请求,我想读取 cookie。它不断返回null

$.ajax({
    type: 'GET',
    url: myUrl,
    success: function(output, status, xhr) {
        alert(xhr.getResponseHeader("MyCookie"));
    },
    cache: false
});

有任何想法吗?我正在为此使用 Chrome。

4

4 回答 4

53

出于安全原因,浏览器无法访问来自 ajax 请求的第三方 cookie,它会自动为您处理这些 cookie!

为此,您需要:

1) 使用您希望从中返回 cookie 的 ajax 请求登录:

$.ajax("https://example.com/v2/login", {
     method: 'POST',
     data: {login_id: user, password: password},
     crossDomain: true,
     success: login_success,
     error: login_error
  });

2)xhrFields: { withCredentials: true }在下一个 ajax 请求中连接以使用浏览器保存的凭据

$.ajax("https://example.com/v2/whatever", {
     method: 'GET',
     xhrFields: { withCredentials: true },
     crossDomain: true,
     success: whatever_success,
     error: whatever_error
  });

浏览器会为您处理这些 cookie,即使它们无法从headersdocument.cookie

于 2016-06-21T22:30:10.107 回答
48

您正在寻找以下响应标头Set-Cookie

xhr.getResponseHeader('Set-Cookie');

但它不适用于 HTTPOnly cookie。

更新

根据XMLHttpRequest Level 1XMLHttpRequest Level 2,这个特定的响应标头属于您可以使用 获取的“禁止”响应标头getResponseHeader(),所以它可以工作的唯一原因基本上是一个“顽皮”的浏览器。

于 2012-10-11T13:21:03.233 回答
3
xhr.getResponseHeader('Set-Cookie');

它对我不起作用。

我用这个

function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) != -1) return c.substring(name.length,c.length);
    }
    return "";
} 

success: function(output, status, xhr) {
    alert(getCookie("MyCookie"));
},

http://www.w3schools.com/js/js_cookies.asp

于 2014-09-11T09:28:29.810 回答
-1

类似于 yebmouxing 我不能

 xhr.getResponseHeader('Set-Cookie');

工作方法。即使我在服务器上将 HTTPOnly 设置为 false,它也只会返回 null。

我也编写了一个简单的 js 辅助函数来从文档中获取 cookie。此功能非常基本,只有在您知道要添加自己的附加信息(寿命、域、路径等)时才有效:

function getCookie(cookieName){
  var cookieArray = document.cookie.split(';');
  for(var i=0; i<cookieArray.length; i++){
    var cookie = cookieArray[i];
    while (cookie.charAt(0)==' '){
      cookie = cookie.substring(1);
    }
    cookieHalves = cookie.split('=');
    if(cookieHalves[0]== cookieName){
      return cookieHalves[1];
    }
  }
  return "";
}
于 2014-11-25T11:15:19.403 回答