Nachdem $.ajax()
ich mich über eine Site $.ajax()
angemeldet habe, versuche ich, eine zweite Anfrage an diese Site zu senden. Wenn ich jedoch die mit FireBug gesendeten Header überprüfe, ist in der Anfrage kein Sitzungscookie enthalten.
Was mache ich falsch?
Antworten:
AJAX-Anrufe senden nur Cookies, wenn sich die von Ihnen angerufene URL in derselben Domain befindet wie Ihr aufrufendes Skript.
Dies kann ein domänenübergreifendes Problem sein.
Möglicherweise haben Sie versucht, eine URL aufzurufen,
www.domain-a.com
während Ihr Anrufskript aktiviert warwww.domain-b.com
(Mit anderen Worten: Sie haben einen domänenübergreifenden Anruf getätigt. In diesem Fall hat der Browser keine Cookies gesendet, um Ihre Privatsphäre zu schützen).In diesem Fall haben Sie folgende Möglichkeiten:
Dieser Proxy kann dann von Ihnen so konfiguriert werden, dass er einen Cookie-Namen und einen Wertparameter akzeptiert, die er an Domäne-a senden kann. Damit dies funktioniert, müssen Sie den Namen des Cookies kennen und den Wert Ihres Servers auf Domain-A für die Authentifizierung angeben.
Ich bin froh, wenn das auch nur ein bisschen geholfen hat.
quelle
path=/something
und Sie die Seite anfordern, wird/another
das Cookie nicht gesendet. Wenn Sie die Seite anfordern, wird/something
das Cookie wie erwartet gesendet. Überprüfen Sie also den Code, der auch das Cookie setzt.Ich arbeite in einem domänenübergreifenden Szenario. Während der Anmeldung gibt der Remote-Server den Set-Cookie-Header zusammen mit
Access-Control-Allow-Credentials
set auf true zurück.Der nächste Ajax-Aufruf an den Remote-Server sollte dieses Cookie verwenden.
CORS
Access-Control-Allow-Credentials
ermöglicht die domänenübergreifende Protokollierung. Beispiele finden Sie unter https://developer.mozilla.org/En/HTTP_access_control .Für mich scheint es ein Fehler in JQuery zu sein (oder zumindest eine zukünftige Funktion in der nächsten Version).
AKTUALISIEREN:
Cookies werden nicht automatisch aus der AJAX-Antwort gesetzt (Zitat: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/ )
Warum?
Sie können den Wert des Cookies nicht aus der Antwort abrufen, um ihn manuell festzulegen ( http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader ).
Ich bin verwirrt..
Es sollte eine Möglichkeit geben,
jquery.ajax()
nach dem Einstellen vonXMLHttpRequest.withCredentials = "true"
Parametern zu fragen .ANTWORT: Sie sollten den
xhrFields
Parameter http://api.jquery.com/jQuery.ajax/ verwenden.Das Beispiel in der Dokumentation lautet:
Es ist auch wichtig, dass der Server diese Anfrage korrekt beantwortet. Kopieren Sie hier tolle Kommentare von @ Frédéric und @Pebbl:
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
Also, wenn die Anfrage lautet:
Der Server sollte antworten mit:
Andernfalls werden die Nutzdaten nicht an das Skript zurückgegeben. Siehe: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
quelle
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
Verwenden von
Als Teil meines jQuery-Ajax-Aufrufs war dies nur ein Teil der Lösung. Ich musste auch die Header in der OPTIONS-Antwort von meiner Ressource zurückgeben:
Es war wichtig, dass sich nur ein zulässiger "Ursprung" im Antwortheader des OPTIONS-Aufrufs befand und nicht "*". Ich habe dies erreicht, indem ich den Ursprung aus der Anfrage gelesen und wieder in die Antwort eingefügt habe - wahrscheinlich um den ursprünglichen Grund für die Einschränkung herum, aber in meinem Anwendungsfall ist die Sicherheit nicht von größter Bedeutung.
Ich dachte, es lohnt sich, ausdrücklich die Anforderung für nur einen Ursprung zu erwähnen, da der W3C-Standard eine durch Leerzeichen getrennte Liste zulässt - Chrome jedoch nicht! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB das "in der Praxis" -Bit.
quelle
Fügen Sie dies in Ihre Init-Funktion ein:
Es wird klappen.
quelle
Es gibt bereits viele gute Antworten auf diese Frage, aber ich dachte, es könnte hilfreich sein, den Fall zu klären, in dem Sie erwarten würden, dass das Sitzungscookie gesendet wird, weil die Cookie-Domain übereinstimmt, aber es wird nicht gesendet, weil die AJAX-Anfrage lautet zu einer anderen Subdomain gemacht werden. In diesem Fall habe ich ein Cookie, das der Domain * .mydomain.com zugewiesen ist, und ich möchte, dass es in eine AJAX-Anfrage an different.mydomain.com aufgenommen wird. "Standardmäßig wird das Cookie nicht gesendet. Sie müssen HTTPONLY im Sitzungscookie nicht deaktivieren, um dieses Problem zu beheben. Sie müssen nur die vorgeschlagenen Schritte ausführen ( https://stackoverflow.com/a/23660618/545223 ) und die folgenden Schritte ausführen .
1) Fügen Sie Ihrer Ajax-Anfrage Folgendes hinzu.
2) Fügen Sie Ihren Antwortheadern Folgendes für Ressourcen in der verschiedenen Subdomain hinzu.
quelle
Nachdem ich die anderen Lösungen ausprobiert hatte und sie immer noch nicht zum Laufen gebracht hatte, fand ich heraus, wo das Problem in meinem Fall lag. Ich habe contentType von "application / json" in "text / plain" geändert.
quelle
Ich hatte das gleiche Problem und führte einige Überprüfungen durch, bei denen mein Skript einfach nicht den Sitzungs-ID-Cookie erhielt.
Ich habe anhand des Sitzungs-ID-Cookie-Werts im Browser herausgefunden, dass mein Framework (Django) das Sitzungs-ID-Cookie mit HttpOnly als Standard übergeben hat. Dies bedeutete, dass Skripte keinen Zugriff auf den Wert der Sitzungs-ID hatten und ihn daher nicht zusammen mit Anforderungen weitergaben. Ein bisschen lächerlich, dass HttpOnly der Standardwert ist, 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
quelle
Wenn Sie
localhost
einen oder einen Port auf localhost entwickeln, z. B.localhost:8080
zusätzlich zu den in den obigen Antworten beschriebenen Schritten, müssen Sie auch sicherstellen, dass Sie keinen Domain-Wert im Set-Cookie-Header übergeben.Sie können die Domain nicht
localhost
im Set-Cookie-Header festlegen - das ist falsch - lassen Sie einfach die Domain weg.Siehe Cookies auf localhost mit expliziter Domain und Warum erstellt asp.net keine Cookies in localhost?
quelle
Nur meine 2 Cent für das Setzen des PHPSESSID-Cookie-Problems auf localhost und in der Entwicklungsumgebung. Ich rufe AJAX an meinem REST-API-Endpunkt auf dem Locahost auf.
mysite.localhost/api/member/login/
Angenommen, die Adresse lautet (virtueller Host in meiner Entwicklungsumgebung).Wenn ich diese Anfrage bei Postman mache, läuft alles gut und PHPSESSID wird mit der Antwort festgelegt.
Wenn ich diesen Endpunkt über AJAX von der Browsersync-Proxy-Seite anfordere (z. B.
122.133.1.110:3000/test/api/login.php
in der Adresszeile meines Browsers, siehe Domain unterscheidet sich von vsmysite.localhost
), wird PHPSESSID unter Cookies nicht angezeigt.Wenn ich diese Anfrage direkt von der Seite in derselben Domain (dh
mysite.localhost/test/api/login.php
) mache, ist PHPSESSID in Ordnung.Dies ist also ein Problem mit Cookies für Ursprungsanfragen, wie in der obigen Antwort von @flu erwähnt
quelle
Hinzufügen meines Szenarios und meiner Lösung für den Fall, dass es jemand anderem hilft. Bei der Verwendung von RESTful-APIs ist ein ähnlicher Fall aufgetreten. Mein Webserver, auf dem HTML- / Skript- / CSS-Dateien gehostet werden, und Application Server-Exposure-APIs wurden in derselben Domäne gehostet. Der Weg war jedoch anders.
benutzte abc.js, die den Cookie mycookie setzten
zu denen API-Anrufe gemacht wurden
Ich habe den Cookie in mydomain / webapis / servicename erwartet und versucht, ihn zu lesen, aber er wurde nicht gesendet. Nachdem ich den Kommentar aus der Antwort gelesen hatte, überprüfte ich im Entwicklungstool des Browsers, dass der Pfad von mycookie auf "/ webpages " gesetzt war und daher im Serviceabruf nicht verfügbar war
Während ich Cookies von jquery setze, habe ich Folgendes getan:
quelle
Vielleicht nicht zu 100% auf die Frage beantwortet, aber ich bin auf diesen Thread gestoßen, in der Hoffnung, ein Sitzungsproblem zu lösen, als ich eine Datei vom Asset Manager des innovastudio-Editors hochgeladen habe. Schließlich war die Lösung einfach: Sie haben einen Flash-Uploader. Deaktivieren Sie dies (Einstellung
in asset.php) und die Lichter fingen wieder an zu blinken.
Da diese Probleme sehr schwer zu debuggen sein können, habe ich festgestellt, dass Sie (in diesem Fall ich) auf dem richtigen Weg sind, wenn Sie Folgendes in den Upload-Handler einfügen:
Ein Sprung in das Protokoll und ich entdeckte schnell die fehlende Sitzung, in der kein Cookie gesendet wurde.
quelle
session_name(isset($_GET['sess']) ? $_GET['sess'] : null);session_start();
diese Weise, sie würden eine funktionierende Sache bekommen