Виявлення перенаправлення в запиті ajax?


94

Я хочу використовувати jQuery, щоб ОТРИМАТИ URL-адресу, і явно перевірити, чи не відповів він переадресацією 302, але не слідувати переспрямуванню.

$.ajaxЗдається, jQuery завжди слідує за переспрямуваннями. Як я можу запобігти цьому і побачити переспрямування, не дотримуючись цього?

Є різні запитання із заголовками на зразок "jquery ajax redirect", але всі вони, здається, передбачають досягнення якоїсь іншої мети, а не просто безпосередню перевірку статусу, який надає сервер.

Відповіді:


87

Запит AJAX ніколи не має можливості НЕ слідувати за перенаправленням (тобто він повинен слідувати за перенаправленням). Більше інформації можна знайти в цій відповіді https://stackoverflow.com/a/2573589/965648


41

Ласкаво просимо в майбутнє!

Зараз ми маємо властивість "responseURL" від об'єкта xhr. ТАК!

Див. Як отримати URL-адресу відповіді в XMLHttpRequest?

Однак jQuery (принаймні 1.7.1) не надає безпосереднього доступу до об'єкта XMLHttpRequest. Ви можете використовувати щось подібне:

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

Це не чисте рішення, і я припускаю, що команда jQuery зробить щось для responseURL у наступних випусках.

ПОРАДА : просто порівняйте вихідну URL-адресу з responseUrl. Якщо воно рівне, то переспрямування не було надано. Якщо він "невизначений", то responseUrl, ймовірно, не підтримується. Однак, як сказав Нік Гарві, запит AJAX ніколи не має можливості НЕ слідувати за перенаправленням, але ви можете вирішити ряд завдань, використовуючи властивість responseUrl .


1
Щоб додати ще кілька ресурсів за цим атрибутом - сторінка MDN на XHR.responseURL - загальна підтримка, здається, чекає на MSIE, яка додала його лише в Edge / 14.
Елі Коллінз,

Дякую ! Дуже корисно
Готьє

Я виявив, що цей код насправді змушує $ .ajax ({url: 'someurl', xhrFields: {withCredentials: true}}) видавати помилку в Internet Explorer, оскільки функція _orgAjax залежить від того, яка змінна 'this' переходить до $ .ajaxSettings об'єкт. Якщо цього не відбувається, jQuery створює об'єкт ActiveX IXMLHTTPRequest замість об'єкта XMLHttpRequest, який не підтримує властивість withCredentials. Я виправив це, зателефонувавши xhr = _orgAjax.call ($. AjaxSettings); замість xhr = _orgAjax (); Я сподіваюся, що це комусь допоможе.
StephenKC

11

Хоча інші, хто відповів на це запитання, (на жаль) прав, що ця інформація прихована від нас браузером, я думав опублікувати обхідне рішення, яке я придумав:

Я сконфігурував свій серверний додаток для встановлення користувацького заголовка відповіді ( X-Response-Url), що містить запитувану URL-адресу. Кожного разу, коли мій код ajax отримує відповідь, він перевіряє, чи xhr.getResponseHeader("x-response-url")визначений, і в цьому випадку порівнює його з URL-адресою, через яку він спочатку запитував $.ajax(). Якщо рядки різняться, я знаю, що було перенаправлення, а крім того, на яку адресу ми насправді прибули.

Це має недолік вимагати певної допомоги на стороні сервера, а також може зіпсуватися, якщо URL-адреса буде змінена (через проблеми з цитуванням / кодуванням тощо) під час туди-назад ... але для 99% випадків це, здається, виконану роботу.


На стороні сервера, моїм конкретним випадком була програма python, що використовує веб-фреймворк Pyramid, і я використав такий фрагмент:

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

Це справді так, що неможливо дізнатися, чи є переспрямування, не скориставшись ним; але, можливо, порівняння очікуваної URL-адреси заголовка з перенаправленою може стати для мене обхідним шляхом на даний момент. Дякую за ідею
Серхіо А.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.