Ajax isteğinde yeniden yönlendirme mi tespit ediyorsunuz?


94

Bir URL almak için jQuery'yi kullanmak ve 302 yönlendirmesiyle yanıt verip vermediğini kontrol etmek, ancak yönlendirmeyi takip etmek istemiyorum .

jQuery'ler $.ajaxher zaman yönlendirmeleri takip ediyor gibi görünüyor. Bunu nasıl önleyebilirim ve yönlendirmeyi takip etmeden nasıl görebilirim?

"Jquery ajax yönlendirmesi" gibi başlıklara sahip çeşitli sorular vardır, ancak bunların tümü, bir sunucunun verdiği durumu doğrudan kontrol etmekten ziyade, başka bir hedefe ulaşmayı içerir.


Benim özel durumumda, bir giriş sayfasına yönlendirme varsa , başarı ve HTML yanıtı için JSON yanıtı bekliyorum . "Giriş" gibi bir anahtar kelime xhr.getResponseHeader("content-type")ile başlayıp başlamadığını text/htmlve gerekirse "oturumunuzun zaman aşımına uğradığını" göstererek sonlandırdım . Bu elbette gerçekten bir cevap değil, geçici bir çözümdür.
Salman A

Yanıtlar:



41

Geleceğe Hoşgeldiniz!

Şu anda xhr nesnesinden bir "responseURL" özelliğine sahibiz. YAŞASIN!

Bkz XMLHttpRequest yanıt url almak nasıl?

Ancak jQuery (en az 1.7.1) XMLHttpRequest nesnesine doğrudan erişim sağlamaz. Bunun gibi bir şey kullanabilirsiniz:

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);
  }
});

Temiz bir çözüm değil ve jQuery ekibinin gelecek sürümlerde responseURL için bir şeyler yapacağını düşünüyorum.

İPUCU : orijinal URL'yi responseUrl ile karşılaştırın. Eşitse, yönlendirme verilmemiştir. "Tanımlanmamış" ise, responseUrl muhtemelen desteklenmemektedir. Ancak, Nick Garvey'in dediği gibi, AJAX isteğinin yönlendirmeyi izleme fırsatı yoktur, ancak responseUrl özelliğini kullanarak bir dizi görevi çözebilirsiniz .


1
Bu özniteliğe biraz daha kaynak eklemek için - XHR.responseURL'deki MDN sayfası - genel destek MSIE'yi bekliyor gibi görünüyor ve bu MSIE'yi yalnızca Edge / 14'e ekliyor.
Eli Collins

Teşekkürler ! Çok kullanışlı
Gautier

Bu kodun $ .ajax ({url: 'someurl', xhrFields: {withCredentials: true}}) işlevinin $ .ajaxSettings'e çözümlenen 'this' değişkenine bağlı olduğu için Internet Explorer'da bir hata atmasına neden olduğunu buldum nesne. Bunu yapmadığında, jQuery, withCredentials özelliğini desteklemeyen XMLHttpRequest nesnesi yerine bir ActiveX IXMLHTTPRequest nesnesi oluşturur. Bunu xhr = _orgAjax.call ($. AjaxSettings); xhr = _orgAjax () yerine; Umarım bu birine yardımcı olur.
StephenKC

11

Bu soruyu yanıtlayan diğer kişiler (ne yazık ki) bu bilgilerin tarayıcı tarafından bizden gizlendiğini doğrularken, bulduğum bir geçici çözüm yayınlayacağımı düşündüm:

Sunucu uygulamamı X-Response-Url, istenen url'yi içeren özel bir yanıt başlığı ( ) ayarlayacak şekilde yapılandırdım . Ajax kodum bir yanıt aldığında xhr.getResponseHeader("x-response-url"), tanımlanıp tanımlanmadığını kontrol eder , bu durumda onu başlangıçta istediği url ile karşılaştırır $.ajax(). Dizeler farklıysa, bir yönlendirme olduğunu ve ayrıca gerçekte ulaştığımız url'yi biliyorum.

Bunun dezavantajı sunucu tarafı yardım gerektiriyor ve ayrıca url gidiş dönüş sırasında munged (alıntı / kodlama sorunları vb. Nedeniyle) olursa bozulabilir ... ancak vakaların% 99'u için bu iş bitti.


Sunucu tarafında, benim özel durumum Pyramid web çerçevesini kullanan bir python uygulamasıydı ve aşağıdaki parçacığı kullandım:

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

Gerçekten de, yönlendirmenin olup olmadığını bilmenin bir yolu olmadığı doğrudur; ancak belki de beklenen başlık URL'sini yeniden yönlendirilmiş olanla karşılaştırmak şu anda benim için geçici bir çözüm olabilir. Fikir için teşekkürler
Sergio A.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.