Отлов 302 НАЙДЕНО в JavaScript

Я использую jQuery для отправки запроса AJAX POST на мой сервер, который может возвращать HTTP-ответ со статусом 302. Затем JavaScript просто отправляет запрос GET на этот URL-адрес, в то время как я хотел бы перенаправить пользователя на URL-адрес в этом ответе. Это возможно?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
40
0
100 559
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

function doAjaxCall() {
   $.ajaxSetup({complete: onRequestCompleted});
   $.get(yourUrl,yourData,yourCallback);
}

function onRequestCompleted(xhr,textStatus) {
   if (xhr.status == 302) {
      location.href = xhr.getResponseHeader("Location");
   }
}

по крайней мере, в FF это не работает, поскольку полный обработчик вызывается с окончательным статусом HTTP, который равен 200 для успешного перенаправления (даже если firebug правильно показывает ответ 302, за которым следует запрос 200 GET).

o_o 18.09.2009 20:51

Почитайте сообщение stackoverflow.com/questions/199099/…. Это объясняет небольшую хитрость, позволяющую обойти браузер, автоматически обрабатывающий 302 для ответа ajax.

Steg 02.10.2009 03:25

Это не улавливает ответ 302.

h--n 02.01.2012 00:19

Я так не думаю. W3C говорит, что перенаправления HTTP с определенными кодами состояния, включая 302, должны выполняться прозрачно. Цитируется ниже:

If the response is an HTTP redirect (status code 301, 302, 303 or 307), then it MUST be transparently followed (unless it violates security or infinite loop precautions). Any other error (including a 401) MUST cause the object to use that error page as the response.

В качестве эксперимента я попытался выполнять запросы Ajax из различных браузеров (Firefox 3.5, Chrome, IE8, IE7, IE6) на сервер, выдающий код статуса 302 и показывающий статус в объекте запроса браузера. В каждом случае получалось 200.

Ответ принят как подходящий

Принятый ответ не работает по указанным причинам. Я опубликовал комментарий со ссылкой на вопрос, в котором описывается взлом, позволяющий обойти проблему прозрачной обработки 302 браузером:

Как управлять запросом перенаправления после вызова jQuery Ajax

Однако это немного грязный хакер, и после долгих поисков я нашел то, что считаю лучшим решением - используйте JSON. В этом случае вы можете сделать все ответы на запросы ajax кодом 200, а в теле ответа вы добавите какой-то объект JSON, который ваш обработчик ответов ajax может затем использовать соответствующим образом.

Не очень применимо во многих случаях [если у вас есть авторизация для обработки фреймворка]

naugtur 12.04.2012 15:29

@Steg Не думаю, что это хорошее решение. Если у вас много вызовов ajax, нужно ли добавлять логику проверки к каждой функции ajax?

smwikipedia 06.01.2016 16:24

другой вариант - сгенерировать ошибку, но добавить настраиваемый заголовок в ответ сервера, который ваше приложение может использовать, чтобы решить, нужно ли изменить местоположение страницы, которая инициировала вызов ajax, на то, что указывает Location (или что-то еще - в моем случае Я просто обновляю страницу, потому что пытаюсь выявить проблемы, когда пользователь не вошел в систему, а обновление страницы позволяет моему бэкэнду, django, использовать обычный механизм «login_required» для входа пользователя в систему и возврата его на страницу)

Kasapo 28.10.2016 00:54

Вместо того, чтобы запрашивать код Javascript для обработки 302, было бы лучше вернуть 500 с настраиваемым кодом ошибки + сообщение о событии 302

В моей проблеме причина была:

Я использовал адрес localhost / Главная / Тест для тестирования страницы. Но код запроса ajax с использованием 127.0.0.1/Home/AjaxRequest для параметра url. Если URL-адреса разные, возникает эта ошибка.

может это кому-то поможет :)

Другие вопросы по теме