Я создаю веб-приложение с различными библиотеками JS (AngularJS, OpenLayers, ...), и мне нужен способ перехвата всех ответов AJAX, чтобы иметь возможность в случае истечения зарегистрированного сеанса пользователя (ответ возвращается со 401 Unauthorized
статусом), чтобы перенаправить его на страницу входа.
Я знаю, что AngularJS предлагает interceptors
управлять такими сценариями, но не смог найти способ добиться такой инъекции в запросы OpenLayers. Поэтому я выбрал ванильный подход JS.
Здесь я нашел этот фрагмент кода ...
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
console.log(this.readyState); // this one I changed
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
... который я адаптировал и выглядит так, как будто он ведет себя так, как ожидалось (тестировал его только в последнем Google Chrome).
Поскольку он изменяет прототип XMLHTTPRequest, мне интересно, насколько это может быть опасным или может привести к серьезным проблемам с производительностью. И, кстати, есть ли какая-нибудь действенная альтернатива?
Обновление: как перехватывать запросы до их отправки
Предыдущий трюк работает нормально. Но что, если в том же сценарии вы захотите ввести некоторые заголовки до отправки запроса? Сделайте следующее:
(function(send) {
XMLHttpRequest.prototype.send = function(data) {
// in this case I'm injecting an access token (eg. accessToken) in the request headers before it gets sent
if(accessToken) this.setRequestHeader('x-access-token', accessToken);
send.call(this, data);
};
})(XMLHttpRequest.prototype.send);
источник
Ответы:
Этот тип перехвата функций совершенно безопасен и регулярно выполняется для других методов по другим причинам.
И единственное влияние на производительность на самом деле - это только один дополнительный вызов функции для каждого
.open()
плюс любой код, который вы выполняете самостоятельно, что, вероятно, несущественно, когда задействован сетевой вызов.В IE это не отловит код, который пытается использовать
ActiveXObject
метод управления для выполнения Ajax. Хорошо написанный код сначала ищетXMLHttpRequest
объект и использует его, если он доступен, и который был доступен начиная с IE 7. Но может быть какой-то код, который использует этотActiveXObject
метод, если он доступен, что было бы истинным в гораздо более поздних версиях IE.В современных браузерах есть и другие способы выполнения вызовов Ajax, например
fetch()
интерфейс, поэтому, если кто-то хочет перехватить все вызовы Ajax, вам нужно перехватить больше, чем простоXMLHttpRequest
.источник
fetch()
функцию, чтобы перехватить все вызовы к ней - хотя я никогда не пробовал этого сам. Похоже, этот модуль это делает.comment_service_ajax
запросы.Это не будет перехватывать XMLHttpRequests для некоторых версий IE (9 и ниже) . В зависимости от библиотеки они могут сначала искать проприетарный элемент управления ActiveX IE.
И, конечно, все ставки отключены, если вы используете нестрогий DOCTYPE в IE, но я уверен, что вы это знали.
Ссылка: CanIuse
источник
Как любезно отмечает редактор AMO Firefox
Rob W
,...
А вот справочная ссылка:
https://xhr.spec.whatwg.org/#the-open()-method
источник