Czy odpowiedź AJAX może ustawić plik cookie?

266

Czy odpowiedź AJAX może ustawić plik cookie? Jeśli nie, jakie jest moje alternatywne rozwiązanie? Czy powinienem ustawić JavaScript, czy coś podobnego?

Billworth Vandory
źródło
Używam Express.js node.js. Zauważyłem, że jeśli to zrobisz, musisz najwyraźniej ustawić pole httpOnly na false po stronie serwera.
Chong Lip Phang,

Odpowiedzi:

247

Tak , możesz ustawić plik cookie w żądaniu AJAX w kodzie po stronie serwera, tak jak w przypadku zwykłego żądania, ponieważ serwer nie może odróżnić zwykłego żądania od żądania AJAX.

Żądania AJAX to tylko specjalny sposób wysyłania zapytań do serwera, serwer będzie musiał odpowiedzieć jak w przypadku każdego żądania HTTP. W odpowiedzi na zapytanie możesz dodać pliki cookie.

to. __curious_geek
źródło
39
Należy pamiętać, że to, czy agent cookie będzie honorował plik cookie HTTP, to inna historia.
Franci Penov
6
@Franci: uzgodniono. Myślę jednak, że pytanie ma sens tylko w przypadku klientów HTTP obsługujących pliki cookie. Tak więc wszyscy pytający chcą tylko wiedzieć, czy pliki cookie można zapisać w żądaniu AJAX, co oznacza, że ​​jego UA obsługuje pliki cookie :)
to. __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.- z w3.org/TR/XMLHttpRequest
smwikipedia
12
To odpowiada, jeśli serwer może odpowiedzieć na żądanie ajax za pomocą nagłówka Set-Cookie. Oczywiście, że tak, ale pytanie brzmi, czy ta odpowiedź rzeczywiście spowoduje, że klient odczyta i ustawi plik cookie otrzymany w odpowiedzi ajax, czy też należy to zrobić ręcznie. To nie jest odpowiedź na to.
Alex
2
@Legends Ajax zwraca zwykle mają X-Requested-Z nagłówka zestaw do XMLHttpRequest, to jak mogą być one zidentyfikowane, ale wniosek może być wykonany bez tego nagłówka, jeśli tak się dzieje, że nie można odróżnić od normalnego ładowania strony
T0M
292

Zgodnie z sekcją 4.6.3 specyfikacji w3 dla XMLHttpRequest agent użytkownika powinien honorować nagłówek Set-Cookie. Odpowiedź brzmi: tak, powinieneś być w stanie.

Cytat:

Jeśli klient użytkownika obsługuje zarządzanie stanem HTTP, powinien on zachować, odrzucić i wysłać pliki cookie (tak jak otrzymano w nagłówku odpowiedzi Set-Cookie i wysłano w nagłówku Cookie), stosownie do przypadku.

Strelok
źródło
1
Czy IE obsługuje nagłówek Set-Cookie w odpowiedziach, w przypadku odpowiedzi XHR?
detj
Tak jak powinno w przypadku przekierowania i nie honoruje w niektórych przeglądarkach.
Walter Macambira,
1
W przypadku przeglądarki Chrome nagłówki otrzymane w żądaniach ajax zostaną automatycznie zastosowane do klienta.
Alex
Odkryłem, że jeśli strona serwera ustawia odpowiedź jako gzip, ciasteczko nie jest ustawiane. Czy to ma być część specyfikacji, czy to tylko kwestia implementacji?
juminoz
89

Dla przypomnienia, należy pamiętać, że wszystkie powyższe są (nadal) prawdziwe tylko wtedy, gdy wywołanie AJAX jest wykonywane w tej samej domenie. Jeśli chcesz ustawić pliki cookie w innej domenie za pomocą AJAX, otwierasz zupełnie inną puszkę robaków . Odczytywanie plików cookie między domenami działa jednak (lub przynajmniej serwer je obsługuje; to, czy UA klienta pozwala na dostęp do kodu, jest znowu innym tematem; od 2014 r. Tak jest).

Bogdan Stăncescu
źródło
26
Aby wysłać pliki cookie między domenami, trzeba ustawić withCredentials flagę
aeosynth
5
W scenariuszu cross-domain, 3 rzeczy muszą się zdarzyć: - (1) potrzeb klienta, aby zestaw withCredentials=truedo xhrobiektu (2) Ustaw Access-Control-Allow-Credentialszarówno w opcjach prefligtu życzenie, a także rzeczywistego życzenie (3) Ustaw cookie w miarę potrzeb
Kunal
6

Sprawdź także, czy Twój serwer nie ustawia bezpiecznych plików cookie na żądanie inne niż HTTP. Właśnie dowiedziałem się, że moje żądanie ajax otrzymywało sesję php z ustawionym „bezpiecznym”. Ponieważ nie korzystałem z protokołu https, nie wysyłałem z powrotem pliku cookie sesji, a moja sesja była resetowana przy każdym żądaniu ajax.

Phil
źródło
czy możesz mi powiedzieć, gdzie mogę sprawdzić, czy ajax jest bezpieczny?
Ziumper,
1
Nie jest tak naprawdę specyficzny dla ajax. Zaznacz „Bezpieczny” w odpowiedzi nagłówka Set-Cookie z serwera, jeśli używasz niezabezpieczonego http: //
Phil