Sto costruendo un'app web con diverse librerie JS (AngularJS, OpenLayers, ...) e ho bisogno di un modo per intercettare tutte le risposte AJAX per poter, nel caso in cui la sessione utente registrata sia scaduta (la risposta torna con lo 401 Unauthorized
stato), reindirizzarlo alla pagina di accesso.
So che AngularJS offre interceptors
di gestire tali scenari, ma non è stato in grado di trovare un modo per ottenere tale iniezione nelle richieste OpenLayers. Quindi ho optato per un approccio JS vanigliato.
Qui ho trovato questo pezzo di codice ...
(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);
... che ho adattato e sembra che si comporti come previsto (l'ho testato solo sull'ultimo Google Chrome).
Poiché modifica il prototipo di XMLHTTPRequest, mi chiedo quanto sia pericoloso questo potrebbe risultare o se potrebbe produrre seri problemi di prestazioni. E comunque ci sarebbe qualche valida alternativa?
Aggiornamento: come intercettare le richieste prima che vengano inviate
Il trucco precedente funziona bene. Ma cosa succede se nella stessa scena si desidera iniettare alcune intestazioni prima che la richiesta venga inviata? Eseguire le seguenti operazioni:
(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);