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.
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
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.
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).
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.
Jawaban:
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.
sumber
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/XMLHttpRequestMenurut bagian spesifikasi w3 4.6.3 untuk XMLHttpRequest agen pengguna harus menghormati header Set-Cookie. Jadi jawabannya adalah ya, Anda harus bisa.
Kutipan:
sumber
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).
sumber
withCredentials=true
untukxhr
objek (2) TetapkanAccess-Control-Allow-Credentials
baik dalam permintaan preflight OPSI maupun permintaan yang sebenarnya (3) Tetapkan cookie sesuai kebutuhanJuga 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.
sumber