Setelah masuk melalui $.ajax()
ke situs, saya mencoba mengirim $.ajax()
permintaan kedua ke situs itu - tetapi ketika saya memeriksa header yang dikirim menggunakan FireBug, tidak ada cookie sesi yang dimasukkan dalam permintaan.
Apa yang saya lakukan salah?
Jawaban:
Panggilan AJAX hanya mengirim Cookie jika url yang Anda panggil berada di domain yang sama dengan skrip panggilan Anda.
Ini mungkin Masalah Lintas Domain.
Mungkin Anda mencoba menelepon url dari
www.domain-a.com
saat skrip panggilan Anda aktifwww.domain-b.com
(Dengan kata lain: Anda membuat Panggilan Domain Silang yang mana peramban tidak akan mengirim cookie apa pun untuk melindungi privasi Anda).Dalam hal ini opsi Anda adalah:
Proxy ini kemudian dapat dikonfigurasi oleh Anda untuk menerima nama cookie dan parameter nilai yang dapat dikirim ke domain-a. Tetapi agar ini berfungsi, Anda perlu mengetahui nama cookie dan menghargai server Anda pada domain-a yang ingin otentikasi.
Senang jika itu sedikit membantu.
sumber
path=/something
dan Anda meminta halaman/another
maka cookie tidak akan dikirim. Ketika Anda meminta halaman/something
, cookie akan dikirim seperti yang diharapkan. Jadi periksa kode yang mengatur cookie juga.Saya beroperasi dalam skenario lintas-domain. Selama login server jauh mengembalikan header Set-Cookie bersama dengan
Access-Control-Allow-Credentials
set ke true.Panggilan ajax berikutnya ke server jauh harus menggunakan cookie ini.
CORS
Access-Control-Allow-Credentials
ada untuk memungkinkan penebangan lintas domain. Periksa https://developer.mozilla.org/En/HTTP_access_control untuk contoh.Bagi saya sepertinya ada bug di JQuery (atau paling tidak fitur-to-be di versi berikutnya).
MEMPERBARUI:
Cookie tidak diatur secara otomatis dari respons AJAX (kutipan: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/ )
Mengapa?
Anda tidak bisa mendapatkan nilai cookie dari respons untuk mengaturnya secara manual ( http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader )
Saya bingung..
Seharusnya ada cara untuk meminta
jquery.ajax()
untuk mengaturXMLHttpRequest.withCredentials = "true"
parameter.JAWABAN: Anda harus menggunakan
xhrFields
param dari http://api.jquery.com/jQuery.ajax/Contoh dalam dokumentasi adalah:
Penting juga bahwa server menjawab dengan benar permintaan ini. Menyalin komentar hebat di sini dari @ Frédéric dan @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: *
Jadi ketika permintaannya adalah:
Server harus merespons dengan:
Kalau tidak, payload tidak akan dikembalikan ke skrip. Lihat: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
sumber
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: *
developer.mozilla.org/en-US/docs/Web/HTTP/…Menggunakan
sebagai bagian dari panggilan ajax jQuery saya hanya bagian dari solusi. Saya juga perlu meminta header dikembalikan dalam tanggapan OPSI dari sumber saya:
Penting bahwa hanya satu "asal" yang diizinkan berada di tajuk respons panggilan OPSI dan bukan "*". Saya mencapai ini dengan membaca asal dari permintaan dan mengisinya kembali ke respons - mungkin menghindari alasan asli untuk pembatasan, tetapi dalam kasus penggunaan saya keamanan tidak penting.
Saya pikir itu layak secara eksplisit menyebutkan persyaratan hanya untuk satu asal, karena standar W3C memang memungkinkan untuk daftar yang dipisahkan ruang - tetapi Chrome tidak! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB bit "dalam praktik".
sumber
Masukkan ini ke dalam fungsi init Anda:
Itu akan berhasil.
sumber
Sudah ada banyak respons yang baik untuk pertanyaan ini, tetapi saya pikir mungkin akan membantu untuk mengklarifikasi kasus di mana Anda akan mengharapkan cookie sesi dikirim karena domain cookie cocok, tetapi itu tidak dikirim karena permintaan AJAX adalah sedang dibuat ke subdomain yang berbeda. Dalam hal ini, saya memiliki cookie yang ditugaskan ke domain * .mydomain.com , dan saya ingin itu dimasukkan dalam permintaan AJAX ke different.mydomain.com ". Secara default, cookie tidak dapat dikirim. Anda tidak perlu menonaktifkan HTTPONLY pada cookie sesi untuk menyelesaikan masalah ini. Anda hanya perlu melakukan apa yang disarankan wombling ( https://stackoverflow.com/a/23660618/545223 ) dan lakukan hal berikut.
1) Tambahkan yang berikut ini ke permintaan ajax Anda.
2) Tambahkan yang berikut ke header respons Anda untuk sumber daya di subdomain yang berbeda.
sumber
Setelah mencoba solusi lain dan masih belum berhasil, saya menemukan apa masalahnya dalam kasus saya. Saya mengubah contentType dari "application / json" menjadi "text / plain".
sumber
Saya mengalami masalah yang sama dan melakukan beberapa pemeriksaan skrip saya hanya tidak mendapatkan cookie sessionid.
Saya menemukan dengan melihat nilai cookie sessionid di browser yang kerangka saya (Django) melewati cookie sessionid dengan HttpOnly sebagai default. Ini berarti bahwa skrip tidak memiliki akses ke nilai sessionid dan karenanya tidak meneruskannya bersama dengan permintaan. Agak konyol bahwa HttpOnly akan menjadi nilai default ketika begitu banyak hal menggunakan Ajax yang akan memerlukan pembatasan akses.
Untuk memperbaikinya, saya mengubah pengaturan (SESSION_COOKIE_HTTPONLY = Salah) tetapi dalam kasus lain ini mungkin berupa bendera "HttpOnly" di jalur cookie
sumber
Jika Anda mengembangkan
localhost
atau port di localhost sepertilocalhost:8080
, selain langkah-langkah yang dijelaskan dalam jawaban di atas, Anda juga perlu memastikan bahwa Anda tidak melewatkan nilai domain di header Set-Cookie.Anda tidak dapat mengatur domain ke
localhost
dalam header Set-Cookie - itu tidak benar - cukup hilangkan domain tersebut.Lihat Cookie di localhost dengan domain eksplisit dan Mengapa asp.net tidak akan membuat cookie di localhost?
sumber
Hanya 2 sen saya pada pengaturan masalah cookie PHPSESSID ketika di localhost dan di bawah lingkungan dev. Saya membuat panggilan AJAX ke titik akhir REST API saya di locahost. Katakan alamatnya
mysite.localhost/api/member/login/
(host utama di lingkungan dev saya).Ketika saya melakukan permintaan ini pada tukang pos , semuanya berjalan dengan baik dan PHPSESSID diatur dengan respons.
Ketika saya meminta titik akhir ini melalui AJAX dari halaman proksi Browsersync (misalnya dari
122.133.1.110:3000/test/api/login.php
dalam baris alamat browser saya, lihat domainnya berbeda vsmysite.localhost
) PHPSESSID tidak muncul di antara cookie.Ketika saya membuat permintaan ini langsung dari halaman di domain yang sama (yaitu
mysite.localhost/test/api/login.php
) PHPSESSID diatur dengan baik.Jadi ini adalah masalah cookie permintaan lintas asal asal seperti yang disebutkan dalam jawaban @flu di atas
sumber
Menambahkan skenario dan solusi saya jika itu membantu orang lain. Saya mengalami kasus serupa ketika menggunakan API ISTIRAHAT. Server Web saya yang menghosting file HTML / Script / CSS dan Server Aplikasi yang mengekspos API dihosting di domain yang sama. Namun jalannya berbeda.
menggunakan abc.js yang mengatur cookie bernama mycookie
dimana panggilan api dilakukan
Saya mengharapkan cookie di mydomain / webapis / servicename dan mencoba membacanya tetapi tidak dikirim. Setelah membaca komentar dari jawabannya, saya memeriksa di alat pengembangan browser bahwa jalur mycookie disetel ke "/ halaman web " dan karenanya tidak tersedia dalam panggilan layanan untuk
Jadi Saat mengatur cookie dari jquery, ini yang saya lakukan -
sumber
Mungkin tidak 100% menjawab pertanyaan, tetapi saya menemukan utas ini dengan harapan menyelesaikan masalah sesi ketika ajax-posting fileupload dari assetmanager editor innovastudio. Akhirnya solusinya sederhana: mereka memiliki pengunggah flash. Menonaktifkan itu (pengaturan
di asset.php) dan lampu mulai berkedip lagi.
Karena masalah ini bisa sangat sulit untuk di-debug, saya menemukan bahwa menempatkan sesuatu seperti yang berikut ini pada pengunggah pengendali akan membuat Anda (well, saya dalam hal ini) di jalur yang benar:
Menyelam ke log dan saya dengan cepat melihat sesi yang hilang, di mana tidak ada cookie yang dikirim.
sumber
session_name(isset($_GET['sess']) ? $_GET['sess'] : null);session_start();
dengan cara ini, mereka akan mendapatkan sesuatu yang berfungsi