Kann eine AJAX-Antwort ein Cookie setzen?

266

Kann eine AJAX-Antwort ein Cookie setzen? Wenn nicht, was ist meine alternative Lösung? Soll ich es mit Javascript oder ähnlichem einstellen?

Billworth Vandory
quelle
Ich benutze node.js Express. Mir ist aufgefallen, dass Sie in diesem Fall das Feld httpOnly anscheinend auch auf der Serverseite auf false setzen müssen.
Chong Lip Phang

Antworten:

247

Ja , Sie können Cookies in der AJAX-Anforderung im serverseitigen Code wie bei einer normalen Anforderung festlegen, da der Server nicht zwischen einer normalen Anforderung oder einer AJAX-Anforderung unterscheiden kann.

AJAX-Anforderungen sind nur eine spezielle Art der Anforderung an den Server. Der Server muss wie bei jeder HTTP-Anforderung antworten. In der Antwort auf die Anfrage können Sie Cookies hinzufügen.

diese. __curious_geek
quelle
39
Denken Sie daran, dass es eine andere Geschichte ist, ob der Cookie vom HTTP-Agenten anerkannt wird.
Franci Penov
6
@Franci: vereinbart. Aber ich denke, die Frage ist nur für http-Clients sinnvoll, die Cookies unterstützen. Alle Fragesteller möchten also nur wissen, ob Cookies in AJAX-Anfragen geschrieben werden können, was bedeutet, dass seine UA Cookies unterstützt :)
dies. __curious_geek
10
If the user agent supports HTTP State Management it should persist, discard and send cookies (as received in the Set-Cookie response header, and sent in the Cookie header) as applicable.- von w3.org/TR/XMLHttpRequest
smwikipedia
12
Dies antwortet, wenn der Server auf eine Ajax-Anfrage mit einem Set-Cookie-Header antworten kann. Und natürlich kann es das, aber die Frage ist, ob diese Antwort tatsächlich dazu führt, dass der Client das in der Ajax-Antwort empfangene Cookie liest und setzt, oder ob dies manuell erfolgen muss. Dies ist keine Antwort darauf.
Alex
2
Bei @Legends Ajax-Anforderungen ist normalerweise der Header X-Requested-With auf XMLHttpRequest gesetzt. Auf diese Weise können sie identifiziert werden. Eine Anforderung kann jedoch ohne diesen Header gestellt werden. In diesem Fall kann sie nicht von einem normalen Seitenladevorgang unterschieden werden
T0m
292

Gemäß der w3-Spezifikation in Abschnitt 4.6.3 für XMLHttpRequest sollte ein Benutzeragent den Set-Cookie-Header berücksichtigen . Die Antwort lautet also: Ja, das sollten Sie können.

Zitat:

Wenn der Benutzeragent die HTTP-Statusverwaltung unterstützt, sollte er Cookies (wie im Set-Cookie-Antwortheader empfangen und im Cookie-Header gesendet) beibehalten, verwerfen und senden.

Strelok
quelle
1
Unterstützt der IE den Set-Cookie-Header in Antworten bei XHR-Antworten?
Detj
Wie es bei einer Weiterleitung sein sollte, und es wird in einigen Browsern nicht berücksichtigt.
Walter Macambira
1
Bei Verwendung von Chrome werden in Ajax-Anforderungen empfangene Header automatisch auf den Client angewendet.
Alex
Ich habe festgestellt, dass das Cookie nicht gesetzt wird, wenn die Serverseite die Antwort als gzip zurücksetzt. Soll das Teil der Spezifikation sein oder ist das nur ein Implementierungsproblem?
Juminoz
89

Beachten Sie, dass alle oben genannten Punkte (noch) nur dann zutreffen, wenn der AJAX-Aufruf in derselben Domäne erfolgt. Wenn Sie mit AJAX Cookies auf einer anderen Domain setzen möchten, öffnen Sie eine völlig andere Dose Würmer . Das Lesen domänenübergreifender Cookies funktioniert jedoch (oder zumindest der Server bedient sie; ob die UA Ihres Clients Ihrem Code den Zugriff auf sie ermöglicht, ist wiederum ein anderes Thema; ab 2014 ist dies der Fall).

Bogdan Stăncescu
quelle
26
Um domänenübergreifende Cookies zu senden, müssen Sie das withCredentials- Flag setzen
aeosynth
5
Für ein domänenübergreifendes Szenario müssen drei Dinge geschehen: (1) Der Client muss withCredentials=truefür das xhrObjekt festlegen. (2) Access-Control-Allow-CredentialsSowohl in der OPTIONS-Preflight-Anforderung als auch in der tatsächlichen Anforderung festlegen. (3) Das Cookie nach Bedarf festlegen.
Kunal
6

Stellen Sie außerdem sicher, dass Ihr Server keine sicheren Cookies für eine Nicht-http-Anforderung setzt. Ich habe gerade herausgefunden, dass meine Ajax-Anfrage eine PHP-Sitzung mit "sicherem" Set bekam. Da ich nicht auf https war, wurde das Sitzungscookie nicht zurückgesendet und meine Sitzung wurde bei jeder Ajax-Anforderung zurückgesetzt.

Phil
quelle
Kannst du mir sagen, wo ich überprüfen kann, ob Ajax sicher eingestellt ist?
Ziumper
1
Es ist nicht wirklich Ajax-spezifisch. Überprüfen Sie die Antwort des Set-Cookie-Headers vom Server auf "Sicher", wenn Sie unsicheres http: //
Phil