web-dev-qa-db-fra.com

Comment obtenir un cookie à partir d'une réponse AJAX?

J'ai un $.ajax demande sur le même domaine et je veux lire le cookie. Il continue à retourner null.

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

Des idées? J'utilise Chrome pour cela.

37
Kees C. Bakker

Vous recherchez un en-tête de réponse de Set-Cookie:

xhr.getResponseHeader('Set-Cookie');

Cela ne fonctionnera pas avec les cookies HTTPOnly cependant.

Mise à jour

Selon les XMLHttpRequest Level 1 et XMLHttpRequest Level 2 , cet en-tête de réponse particulier relève des en-têtes de réponse "interdits" que vous pouvez obtenir à l'aide de getResponseHeader(), la seule raison pour laquelle cela pourrait fonctionner est donc essentiellement un navigateur "vilain".

37
Ja͢ck

Le navigateur ne peut pas donner accès aux cookies tiers, comme ceux reçus de requêtes ajax pour des raisons de sécurité, cependant il s'en charge automatiquement pour vous!

Pour que cela fonctionne, vous devez:

1) identifiez-vous avec la demande ajax à partir de laquelle vous attendez les cookies:

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

2) Connectez-vous avec xhrFields: { withCredentials: true } dans la ou les prochaines demandes ajax d'utiliser les informations d'identification enregistrées par le navigateur

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

Le navigateur prend soin de ces cookies pour vous, même s’ils ne sont pas lisibles à partir du headers ni du document.cookie

43
MrE
xhr.getResponseHeader('Set-Cookie');

Cela ne fonctionnera pas pour moi.

Je l'utilise

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

Semblable à yebmouxing je ne pouvais pas le

 xhr.getResponseHeader('Set-Cookie');

méthode de travail. Il ne renverrait que null même si j'avais défini HTTPOnly sur false sur mon serveur.

Moi aussi j'ai écrit une simple fonction d'assistance js pour récupérer les cookies du document. Cette fonction est très basique et ne fonctionne que si vous connaissez les informations supplémentaires (durée de vie, domaine, chemin, etc.) à ajouter vous-même:

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