Estou construindo um aplicativo da web com diferentes bibliotecas JS (AngularJS, OpenLayers, ...) e preciso de uma forma de interceptar todas as respostas AJAX para poder, no caso de a sessão do usuário logado expirar (a resposta volta com 401 Unauthorized
status), redirecioná-lo para a página de login.
Eu sei que o AngularJS se oferece interceptors
para gerenciar esses cenários, mas não foi capaz de encontrar uma maneira de conseguir tal injeção nas solicitações do OpenLayers. Então, optei por uma abordagem JS baunilha.
Aqui encontrei este pedaço de código ...
(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);
... que adaptei e parece que se comporta como esperado (testei apenas no último Google Chrome).
Como ele modifica o protótipo de XMLHTTPRequest, estou me perguntando o quão perigoso isso pode resultar ou se pode produzir sérios problemas de desempenho. E a propósito, haveria alguma alternativa válida?
Atualização: como interceptar solicitações antes de serem enviadas
O truque anterior funciona bem. Mas e se no mesmo cenário você quiser injetar alguns cabeçalhos antes que a solicitação seja enviada? Faça o seguinte:
(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);