Обнаружение перенаправления в jQuery $."Аякс"?



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



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



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

616   3  

3 ответов:

запрос AJAX никогда не имеет возможности не следовать перенаправлению (т. е. он должен следовать перенаправлению). Более подробную информацию можно найти в этом ответе https://stackoverflow.com/a/2573589/965648

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

прямо сейчас у нас есть свойство" 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 собственность.

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

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

это имеет недостаток, требующий некоторой помощи на стороне сервера, а также может сломаться, если url-адрес получает munged (из-за проблем с цитированием/кодировкой и т. д.) Во время поездки туда и обратно... но в 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

Comments

    Ничего не найдено.