如何从AJAX响应获取cookie?

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

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

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

您正在寻找Set-Cookie的响应标题:

 xhr.getResponseHeader('Set-Cookie'); 

它不会使用HTTPOnly cookies。

更新

根据XMLHttpRequest Level 1和XMLHttpRequest Level 2 ,这个特定的响应标题位于可以使用getResponseHeader()获得的“禁止”响应标题下,所以这可以起作用的唯一原因基本上就是一个“淘气”的浏览器。

浏览器不能访问第三方cookie,如从安全原因的ajax请求接收的第三方cookie, 它会自动为您处理!

为了这个工作,你需要:

1)用您希望返回cookie的ajax请求login:

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

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

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

即使浏览器无法从头headersdocument.cookie读取,浏览器也会为您处理这些Cookie

 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

与yebmouxing类似,我不能

  xhr.getResponseHeader('Set-Cookie'); 

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

我也写了一个简单的js帮助函数从文档中获取cookie。 这个function是非常基本的,只有当你知道额外的信息(寿命,域名,path等等)来添加你自己时才有效:

 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 ""; }