386 Stimmen

Warum sendet die .ajax()-Methode von jQuery mein Session-Cookie nicht?

Nach der Anmeldung über $.ajax() zu einer Website, ich versuche, eine zweite $.ajax() Aber wenn ich die mit FireBug gesendeten Header überprüfe, ist kein Sitzungscookie in der Anfrage enthalten.

Was mache ich falsch?

13voto

Janno Teelem Punkte 304

Nachdem ich die anderen Lösungen ausprobiert hatte und es immer noch nicht klappte, fand ich heraus, was das Problem in meinem Fall war. Ich habe den ContentType von "application/json" auf "text/plain" geändert.

$.ajax(fullUrl, {
    type: "GET",
    contentType: "text/plain",
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true
});

4voto

wiwa Punkte 59

Ich hatte dasselbe Problem und habe einige Überprüfungen durchgeführt, weil mein Skript das Sessionid-Cookie einfach nicht erhalten hat.

Ich fand heraus, indem ich mir den Wert des sessionid-Cookies im Browser ansah, dass mein Framework (Django) das sessionid-Cookie standardmäßig mit HttpOnly übergab. Das bedeutete, dass Skripte keinen Zugriff auf den sessionid-Wert hatten und ihn daher nicht mit Anfragen weitergaben. Irgendwie lächerlich, dass HttpOnly der Standardwert sein würde, wenn so viele Dinge Ajax verwenden, die eine Zugriffsbeschränkung erfordern würden.

Um dies zu beheben, habe ich eine Einstellung geändert (SESSION_COOKIE_HTTPONLY=False), aber in anderen Fällen kann es sich um ein "HttpOnly"-Flag im Cookie-Pfad handeln

1voto

jitin Punkte 732

Wenn Sie die Entwicklung auf localhost oder einen Port auf localhost wie localhost:8080 Zusätzlich zu den in den obigen Antworten beschriebenen Schritten müssen Sie auch sicherstellen, dass Sie im Set-Cookie-Header keinen Domänenwert übergeben.
Sie können die Domäne nicht auf localhost im Set-Cookie-Header - das ist nicht korrekt - lassen Sie einfach die Domain weg.

Voir Cookies auf localhost mit expliziter Domain et Warum erstellt asp.net keine Cookies auf localhost?

0voto

Valentine Shi Punkte 4789

Nur meine 2 Cents auf Einstellung PHPSESSID Cookie Problem, wenn auf localhost und unter dev-Umgebung. Ich mache den AJAX-Aufruf zu meinem REST-API-Endpunkt auf dem locahost. Sagen wir, die Adresse lautet mysite.localhost/api/member/login/ (virtueller Host in meiner Entwicklungsumgebung).

  • Wenn ich diese Anfrage auf Postbote geht alles gut und PHPSESSID wird mit der Antwort gesetzt.

  • Wenn ich diesen Endpunkt über AJAX von der Browsersync-Proxyseite anfordere (z. B. von 122.133.1.110:3000/test/api/login.php in der Adresszeile meines Browsers sehen, dass die Domäne anders ist als mysite.localhost ) PHPSESSID erscheint nicht unter den Cookies.

  • Wenn ich diese Anfrage direkt von der Seite auf derselben Domäne stelle (d. h. mysite.localhost/test/api/login.php ) PHPSESSID ist richtig eingestellt.

Es handelt sich also um ein herkunftsübergreifendes Problem mit Cookies, wie von @flu erwähnt obige Antwort

0voto

Codeek Punkte 1604

Ich füge mein Szenario und meine Lösung hinzu, falls es jemand anderem hilft. Ich bin bei der Verwendung von RESTful APIs auf einen ähnlichen Fall gestoßen. Mein Webserver, auf dem HTML/Script/CSS-Dateien gehostet werden, und der Anwendungsserver, der die APIs bereitstellt, befanden sich auf derselben Domäne. Der Pfad war jedoch unterschiedlich.

Webserver - meineDomäne/ Internet-Seiten /abc.html

gebraucht abc.js die ein Cookie mit dem Namen mycookie

Anwendungsserver - mydomain/ webapis /Servicename.

welche Api-Aufrufe gemacht wurden

Ich habe das Cookie in mydomain/webapis/servicename erwartet und versucht, es zu lesen, aber es wurde nicht gesendet. Nachdem ich den Kommentar in der Antwort gelesen habe, habe ich im Entwicklungstool des Browsers überprüft, dass der Pfad von mycookie auf "/" gesetzt wurde Internet-Seiten " und daher nicht verfügbar im Dienstaufruf an

mydomain/ webapis /Servicename

Also während der Einstellung Cookie von Jquery, das ist, was ich tat -

$.cookie("mycookie","mayvalue",{**path:'/'**});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X