Je suis en train de créer une application Web avec différentes bibliothèques JS (AngularJS, OpenLayers, ...) et j'ai besoin d'un moyen d'intercepter toutes les réponses AJAX pour pouvoir, au cas où la session utilisateur enregistrée expirait (la réponse revient avec le 401 Unauthorized
statut), le rediriger à la page de connexion.
Je sais qu'AngularJS propose interceptors
de gérer de tels scénarios, mais je n'ai pas été en mesure de trouver un moyen de réaliser une telle injection dans les requêtes OpenLayers. J'ai donc opté pour une approche JS vanille.
Ici, j'ai trouvé ce morceau de code ...
(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 j'ai adapté et qui semble se comporter comme prévu (ne l'a testé que sur le dernier Google Chrome).
Comme il modifie le prototype de XMLHTTPRequest, je me demande à quel point cela pourrait être dangereux ou si cela pourrait produire de graves problèmes de performances. Et au fait, y aurait-il une alternative valable?
Mise à jour: comment intercepter les demandes avant qu'elles ne soient envoyées
L'astuce précédente fonctionne bien. Mais que se passe-t-il si dans le même scénario vous souhaitez injecter des en-têtes avant que la requête ne soit envoyée? Procédez comme suit:
(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);