web-dev-qa-db-ja.com

AJAX応答からCookieを取得する方法は?

$.ajax同じドメインでリクエストし、Cookieを読みたい。 nullを返し続けます。

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

何か案は?このためにChromeを使用しています。

37
Kees C. Bakker

_Set-Cookie_の応答ヘッダーを探しています:

_xhr.getResponseHeader('Set-Cookie');
_

ただし、HTTPOnly Cookieでは機能しません。

更新

XMLHttpRequest Level 1 および XMLHttpRequest Level 2 によれば、この特定の応答ヘッダーは、getResponseHeader()を使用して取得できる「禁止」応答ヘッダーに該当します。したがって、これが機能する唯一の理由は、基本的に「いたずらな」ブラウザです。

37
Ja͢ck

browserは、セキュリティ上の理由でajaxリクエストから受信したようなサードパーティCookieへのアクセスを許可できません、however自動的にそれらを処理します!

これが機能するためには、次のことが必要です。

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)次のajaxリクエストでxhrFields: { withCredentials: true }で接続し、ブラウザで保存された資格情報を使用します

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

これらのCookieは、headersdocument.cookieから読み取れない場合でも、ブラウザが処理します

43
MrE
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

2
alexis

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