Я создаю веб-приложение с различными библиотеками 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);