Mendeteksi pengalihan dalam permintaan ajax?

94

Saya ingin menggunakan jQuery untuk MENDAPATKAN URL dan secara eksplisit memeriksa apakah itu merespons dengan pengalihan 302, tetapi tidak mengikuti pengalihan.

jQuery $.ajax tampaknya selalu mengikuti pengalihan. Bagaimana cara mencegahnya, dan melihat pengalihan tanpa mengikutinya?

Ada berbagai pertanyaan dengan judul seperti "jquery ajax redirect" tetapi semuanya tampaknya melibatkan pencapaian beberapa tujuan lain, daripada hanya memeriksa langsung status yang diberikan server.

kdt
sumber

Jawaban:

41

Selamat datang di masa depan!

Sekarang kami memiliki properti "responseURL" dari objek xhr. YAY!

Lihat Bagaimana cara mendapatkan url tanggapan di XMLHttpRequest?

Namun, jQuery (setidaknya 1.7.1) tidak memberikan akses ke objek XMLHttpRequest secara langsung. Anda dapat menggunakan sesuatu seperti ini:

var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
  xhr = _orgAjax();
  return xhr;
};

jQuery.ajax('http://test.com', {
  success: function(responseText) {
    console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
  }
});

Ini bukan solusi bersih dan saya kira tim jQuery akan membuat sesuatu untuk responseURL di rilis mendatang.

TIPS : bandingkan saja URL asli dengan responseUrl. Jika sama, maka tidak ada pengalihan yang diberikan. Jika "tidak ditentukan" maka responseUrl mungkin tidak didukung. Namun seperti yang dikatakan Nick Garvey, permintaan AJAX tidak pernah memiliki kesempatan untuk TIDAK mengikuti pengalihan tetapi Anda dapat menyelesaikan sejumlah tugas dengan menggunakan properti responseUrl .

Riki_tiki_tavi
sumber
1
Untuk menambahkan lebih banyak sumber daya pada atribut ini - halaman MDN di XHR.responseURL - dukungan umum tampaknya menunggu di MSIE, yang hanya menambahkannya di Edge / 14.
Eli Collins
Terima kasih! Sangat berguna
Gautier
Saya menemukan bahwa kode ini sebenarnya membuat $ .ajax ({url: 'someurl', xhrFields: {withCredentials: true}}) memunculkan kesalahan di Internet Explorer karena fungsi _orgAjax bergantung pada variabel 'this' yang menyelesaikan ke $ .ajaxSettings obyek. Jika tidak, jQuery membuat objek ActiveX IXMLHTTPRequest sebagai ganti objek XMLHttpRequest, yang tidak mendukung properti withCredentials. Saya memperbaikinya dengan memanggil xhr = _orgAjax.call ($. AjaxSettings); bukannya xhr = _orgAjax (); Saya harap ini membantu seseorang.
StephenKC
11

Sementara orang lain yang menjawab pertanyaan ini (sayangnya) benar bahwa informasi ini disembunyikan dari kami oleh browser, saya pikir saya akan memposting solusi yang saya dapatkan:

Saya mengonfigurasi aplikasi server saya untuk menyetel header tanggapan khusus ( X-Response-Url) yang berisi url yang diminta. Setiap kali kode ajax saya menerima respons, ia memeriksa apakah xhr.getResponseHeader("x-response-url")sudah ditentukan, dalam hal ini membandingkannya dengan url yang awalnya diminta melalui $.ajax(). Jika string berbeda, saya tahu ada pengalihan, dan juga, url apa yang sebenarnya kami tuju.

Ini memang memiliki kelemahan karena membutuhkan bantuan sisi server, dan juga dapat rusak jika url menjadi diperkecil (karena masalah kutipan / pengkodean dll) selama perjalanan pulang pergi ... tetapi untuk 99% kasus, ini tampaknya mendapatkan pekerjaan selesai.


Di sisi server, kasus khusus saya adalah aplikasi python menggunakan kerangka web Pyramid, dan saya menggunakan cuplikan berikut:

import pyramid.events

@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
    request = event.request
    if request.is_xhr:
        event.response.headers['X-Response-URL'] = request.url
Eli Collins
sumber
Memang benar bahwa tidak ada cara untuk mengetahui apakah ada pengalihan tanpa mengambilnya; tetapi mungkin membandingkan URL tajuk yang diharapkan dengan yang diarahkan ulang dapat menjadi solusi bagi saya saat ini. Terima kasih atas idenya
Sergio A.
4

Anda sekarang dapat menggunakan API pengambilan / Ini kembaliredirected: *boolean*

fvrab.dll
sumber