Mengembalikan arahan sebagai respons terhadap permintaan XHR

Jawaban:

216

Apa yang terjadi jika browser menerima respons pengalihan ke permintaan ajax?

Jika server mengirim pengalihan (alias respons 302 plus Lokasi: header) pengalihan tersebut secara otomatis diikuti oleh peramban. Respons terhadap permintaan kedua (dengan asumsi itu juga bukan pengalihan lain) adalah apa yang terpapar ke program Anda.

Bahkan, Anda tidak memiliki kemampuan untuk mendeteksi apakah respons 302 telah terjadi. Jika 302 redirect mengarah ke 200, maka program Anda bertindak secara identik seolah-olah permintaan asli mengarah langsung ke 200.

Ini adalah pengalaman saya dan perilaku yang disebutkan dalam spesifikasi .

Pembaruan 2016: Waktu telah berlalu, dan kabar baiknya adalah API fetch baru () khusus akan menawarkan kontrol yang lebih baik tentang bagaimana pengalihan ditangani , dengan perilaku default mirip dengan XHR. Yang mengatakan, itu hanya bekerja di mana fetch () diimplementasikan secara asli . Versi pengambilan polyfill () —yang didasarkan pada XHR — terus memiliki batasan XHR . Untungnya, dukungan peramban asli tampaknya berhasil dengan baik.

Greim
sumber
47
Menariknya, saya sampai pada ini karena saya mengalami situasi di mana pengalihan tampaknya tidak diikuti ... ini terjadi ketika pengalihan melanggar kebijakan asal yang sama.
Gus
4
@ Tuhan yang mungkin logis
Dmitry
1
Dalam kasus pengalihan ke 401 (atau kesalahan 4xx atau 5xx) saya berasumsi program Anda akan berperilaku seolah-olah permintaan mengarah langsung ke 401. Apakah itu bukan yang Anda lihat?
greim
2
API yang tenang dapat mengirim 201 dan header Lokasi setelah permintaan POST; lihat restapitutorial.com/lessons/httpmethods.html .
1
Pembaruan 2019: fetch tidak berfungsi seperti yang kami harapkan 3 tahun yang lalu):
lcjury
7

The ajax-requestakan mengikuti redirect afaik. Konten aktual ( .responseText, .responseXML) akan menjadi konten dari halaman yang Anda arahkan ke.

Anda mungkin dapat mencegat pengalihan ( status-code, location-header) pada readyState2 atau 3, tetapi tidak yakin tentang hal itu.

jishi
sumber
Tidak, semua negara bagian itu memiliki status yang sama persis. Bahkan nilainya getAllResponseHeaders()sama.
sebastianwagner