Обнаружение перенаправления в jQuery $.ajax?

Я хочу использовать jQuery для получения URL-адреса и явно проверить, ответил ли он перенаправлением 302, но не следует перенаправлять.

jQuery $.ajax, как представляется, всегда следует за перенаправлениями. Как я могу предотвратить это и видеть перенаправление, не следуя за ним?

Существуют различные вопросы с такими заголовками, как "jQuery ajax redirect", но все они, как представляется, предполагают достижение какой-либо другой цели, а не просто проверку статуса, предоставляемого сервером.

Ответ 1

Запрос AJAX никогда не имеет возможности НЕ следовать перенаправлению (т.е. он должен следовать за перенаправлением). Более подробную информацию можно найти в этом ответе fooobar.com/questions/50609/...

Ответ 2

Добро пожаловать в будущее!

Теперь у нас есть свойство responseURL от объекта xhr. YAY!

Смотрите Как получить 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 с ответомUrl. Если он равен, то перенаправление не было дано. Если это "undefined", то responseUrl, вероятно, не поддерживается. Однако, как сказал Ник Гарви, запрос AJAX никогда не имеет возможности НЕ следовать перенаправлению, но вы можете решить ряд задач, используя свойство responseUrl.

Ответ 3

jQuery работает в пределах вашего браузера javascript engine. Каждый ресурс, который запрашивается через элементы javascript или html (ссылка, script, изображение, аудио или видео и т.д.), Зависит от перенаправления http. К сожалению, нет возможности для javascript для доступа к низкоуровневому http так, как вам нужно.

Так жаль, ответ - нет.

Ответ 4

В то время как другие люди, которые ответили на этот вопрос (к сожалению) правильно, что эта информация скрыта от нас браузером, я подумал, что опубликую обходное решение, которое я придумал:

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

У этого есть недостаток, требующий некоторой помощи на стороне сервера, а также может сломаться, если 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

Ответ 5

$.ajax({
 type: "POST",
 url: "http://arudhrainnovations.com/android/testregister.php",
 data: dataString,
 dataType: "json",
 cache: false,
 success: function(result){
      alert(result);
      }
 }
 if (result.success==1)
 {
     windows.locations = "index.html";
     return;
 }

Чтобы перенаправить файл после ответа json на реальном сервере. проверить тег respone success ==1 и поставьте приведенный ниже код для перенаправления.

windows.locations = "index.html";

Пожалуйста, дайте мне знать более подробную информацию на [email protected]