Можно ли запретить браузеру следовать перенаправлениям при отправке XMLHttpRequest-s (т.е. получить код статуса перенаправления и обработать его самостоятельно)?
Запретить перенаправление Xmlhttprequest
Ответы (5)
Не согласно стандарт W3C для объекта XMLHttpRequest (выделено мной):
Если ответ представляет собой перенаправление HTTP:
Если источник URL, передаваемый заголовком Location, совпадает с источником XMLHttpRequest и перенаправление не нарушает меры предосторожности с бесконечным циклом, прозрачно следуйте перенаправлению, соблюдая правила событий запроса того же источника.
Они рассматривали это для будущего выпуска:
Эта спецификация не включает следующие функции, которые рассматриваются в будущей версии этой спецификации:
- Свойство для отключения следующих редиректов;
но в последней спецификации это больше не упоминается.
Новый Fetch API поддерживает различные режимы обработки перенаправления: follow
, error
и manual
, но я не могу найти способ просмотреть новый URL-адрес или код состояния, когда перенаправление было отменено. Вы просто можете остановить само перенаправление, и тогда это будет похоже на ошибку (пустой ответ). Если это все, что вам нужно, можете идти. Также вы должны знать, что запросы, сделанные через этот API, еще не могут быть отменены . Они сейчас.
Что касается XMLHttpRequest, вы можете HEAD
сервер и проверить, изменился ли URL:
var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
if (this.readyState === this.DONE) {
console.log(this.responseURL);
}
};
http.send();
Вы не получите код статуса, но найдете новый URL, не загружая с него всю страницу.
OPTIONS
может быть лучшим выбором, в любом случае работает только для не общих целей и т. Д. Администратор настроил перенаправление всего сайта / схемы, например HTTP - ›HTTPS
- person William Leung; 21.12.2016
Вы можете использовать свойство responseURL
, чтобы получить место назначения перенаправления или проверить, был ли ответ в конечном итоге получен из приемлемого места.
Это, конечно, означает, что результат все равно будет получен, но, по крайней мере, вы можете получить необходимую информацию о месте назначения перенаправления и, например, определить условия, при которых вы хотите отказаться от ответа.
Нет, в API, предоставляемом XMLHttpRequest, нет места, которое позволяет вам автоматически переопределить его поведение по умолчанию, следуя 301 или 302.
Если клиент запускает IE в Windows, вы можете использовать WinHTTP вместо этого, чтобы установить параметр, предотвращающий такое поведение, но это очень ограничивающее решение.
Невозможно обрабатывать перенаправление или статус 302 на стороне клиента, как указано в других комментариях. Однако вы можете предотвратить перенаправление. Для этого вы можете установить заголовок запроса X-Requested-With с помощью XMLHttpRequest xhttp.setRequestHeader (X-Requested-With, XMLHttpRequest); Это нужно делать после открытия, но перед отправкой. Пример ниже
let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
reqObj.success(JSON.parse(this.responseText))
} else if (this.status != 200) {
reqObj.error(this.statusText)
}
};
xhttp.open(reqObj.type, reqObj.url, reqObj.async);
xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhttp.send();