Я создаю веб-приложение с различными JS-библиотеками (AngularJS, OpenLayers,...) и нуждаюсь в возможности перехватить все ответы AJAX, чтобы иметь возможность, в случае, если истекший сеанс сеанса пользователя (ответ возвращается с 401 Unauthorized
status), чтобы перенаправить его на страницу входа.
Я знаю, что AngularJS предлагает interceptors
управлять такими сценариями, но не смог найти способ добиться такой инъекции в запросы OpenLayers. Поэтому я выбрал подход Vanilla 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);