web-dev-qa-db-fra.com

Cross domain POST la requête n'envoie pas de cookie Ajax Jquery

On dirait que quelque chose de similaire a déjà été discuté sur stackoverflow, mais je ne pouvais pas trouver exactement le même.

J'essaie d'envoyer un cookie avec CORS (partage de ressources d'origine croisée), mais cela ne fonctionne pas.

Ceci est mon code.

$.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);
      }
    }
);

Je ne vois pas ce cookie à la demande HEADER.

57
Kirill Reva

Vous ne pouvez pas définir ou lire les cookies sur les demandes CORS via JavaScript. Bien que CORS autorise les demandes provenant de plusieurs pays, les cookies restent soumis à la politique du navigateur sur la même origine, ce qui signifie que seules les pages de la même origine peuvent lire/écrire le cookie. withCredentials signifie uniquement que tous les cookies définis par l'hôte distant sont envoyés à cet hôte distant. Vous devrez définir le cookie du serveur distant en utilisant le Set-Cookie entête.

62
monsur

Veuillez noter que cela ne résout pas le processus de partage des cookies, car c'est en général une mauvaise pratique.

Vous devez utiliser JSONP en tant que votre type:

Documentation à partir de $ .ajax: Les requêtes interdomaines et dataType: Les requêtes "jsonp" ne prennent pas en charge les opérations synchrones.

$.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);
      }
    }
);
20
abc123

J'ai eu le même problème. L'ID de session est envoyé dans un cookie, mais comme la demande est interdomaine, les paramètres de sécurité du navigateur bloquent l'envoi du cookie.

Solution: Générez l'ID de session sur le client (dans le navigateur), utilisez JavaScript sessionStorage pour stocker l'ID de session, puis envoyez l'ID de session avec chaque demande à le serveur.

J'ai beaucoup lutté avec ce problème et il n'y avait pas beaucoup de bonnes réponses autour. Voici un article détaillant la solution: Requête Javascript sur plusieurs domaines avec session

6
PerKristian