Bisakah respons AJAX mengatur cookie?

266

Bisakah respons AJAX mengatur cookie? Jika tidak, apa solusi alternatif saya? Haruskah saya mengaturnya dengan Javascript atau yang serupa?

Billworth Vandory
sumber
Saya menggunakan node.js Express. Saya perhatikan bahwa jika Anda melakukannya, Anda harus mengatur bidang httpOnly menjadi false di sisi server juga ternyata.
Chong Lip Phang

Jawaban:

248

Ya , Anda dapat mengatur cookie dalam permintaan AJAX dalam kode sisi server seperti yang Anda lakukan untuk permintaan normal karena server tidak dapat membedakan antara permintaan normal atau permintaan AJAX.

Permintaan AJAX hanyalah cara khusus untuk meminta ke server, server harus merespons kembali seperti dalam permintaan HTTP apa pun. Sebagai tanggapan atas permintaan Anda, Anda dapat menambahkan cookie.

ini. __curious_geek
sumber
40
Perlu diingat bahwa apakah cookie akan dihormati oleh agen HTTP adalah cerita lain.
Franci Penov
6
@ Franci: setuju. Tapi saya pikir pertanyaannya hanya masuk akal untuk klien http yang mendukung cookie. Jadi semua penanya hanya ingin tahu apakah cookie dapat ditulis dalam permintaan AJAX yang berarti UA-nya mendukung cookie :)
ini. __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.- dari w3.org/TR/XMLHttpRequest
smwikipedia
12
Ini menjawab jika server dapat membalas permintaan ajax dengan header Set-Cookie. Dan tentu saja bisa, tetapi pertanyaannya adalah apakah respons itu akan benar-benar menghasilkan klien membaca dan menetapkan cookie yang diterima dalam respons ajax, atau jika harus dilakukan secara manual. Ini bukan jawaban untuk itu.
Alex
2
@Legends Permintaan Ajax biasanya memiliki header X-Diminta-Dengan diatur ke XMLHttpRequest, ini adalah bagaimana mereka dapat diidentifikasi, tetapi permintaan dapat dibuat tanpa header ini, jika ini terjadi tidak dapat dibedakan dari memuat halaman normal
T0m
293

Menurut bagian spesifikasi w3 4.6.3 untuk XMLHttpRequest agen pengguna harus menghormati header Set-Cookie. Jadi jawabannya adalah ya, Anda harus bisa.

Kutipan:

Jika agen pengguna mendukung Manajemen Status HTTP, agen pengguna harus bertahan, membuang dan mengirim cookie (seperti yang diterima di tajuk respons Set-Cookie, dan dikirim dalam tajuk Cookie) sebagaimana berlaku.

Strelok
sumber
1
Apakah IE mendukung tajuk Set-Cookie dalam tanggapan, jika ada tanggapan XHR?
detj
Seperti seharusnya pada redirect, dan itu tidak menghormati di beberapa browser.
Walter Macambira
1
Bagi saya yang menggunakan Chrome, tajuk yang diterima dalam permintaan ajax akan secara otomatis diterapkan ke klien.
Alex
Saya menemukan bahwa jika sisi server mengatur kembali respons sebagai gzip, cookie tidak dapat disetel. Apakah itu seharusnya menjadi bagian dari spesifikasi atau itu hanya masalah implementasi?
juminoz
89

Sebagai catatan, maklum bahwa semua hal di atas (masih) benar hanya jika panggilan AJAX dilakukan pada domain yang sama. Jika Anda mencari pengaturan cookie di domain lain menggunakan AJAX, Anda membuka kaleng cacing yang sama sekali berbeda . Namun, membaca cookie lintas-domain tidak berfungsi (atau setidaknya server menyajikannya; apakah UA klien Anda memungkinkan kode Anda untuk mengaksesnya, sekali lagi, merupakan topik yang berbeda; pada 2014 mereka melakukannya).

Bogdan Stăncescu
sumber
26
Untuk mengirim cookie lintas-domain, Anda perlu mengatur withCredentials bendera
aeosynth
5
Untuk skenario lintas-domain, 3 hal perlu terjadi: - (1) Klien perlu mengatur withCredentials=trueuntuk xhrobjek (2) Tetapkan Access-Control-Allow-Credentialsbaik dalam permintaan preflight OPSI maupun permintaan yang sebenarnya (3) Tetapkan cookie sesuai kebutuhan
Kunal
6

Juga periksa apakah server Anda tidak mengatur cookie aman berdasarkan permintaan non http. Baru tahu bahwa permintaan ajax saya mendapatkan sesi php dengan set "aman". Karena saya tidak menggunakan https, itu tidak mengirimkan kembali cookie sesi dan sesi saya diset ulang pada setiap permintaan ajax.

Phil
sumber
dapatkah Anda memberi tahu saya, di mana saya dapat memeriksa apakah ajax secure diatur?
Ziumper
1
Ini tidak benar-benar spesifik ajax. Periksa "Aman" di respons tajuk Set-Cookie dari server jika Anda menggunakan http tidak aman: //
Phil