Abfangen aller AJAX-Anforderungen von verschiedenen JS-Bibliotheken
Ich erstelle eine Web-App mit verschiedenen JS-Bibliotheken (AngularJS, OpenLayers, ...) und brauche eine Möglichkeit, um alle AJAX-Antworten abfangen zu können, falls die protokollierte Benutzersitzung abgelaufen ist (Rückantwort mit)401 Unauthorized
status), um ihn auf die Anmeldeseite umzuleiten.
Ich kenne AngularJS-Angeboteinterceptors
um solche Szenarien zu managen, konnte aber keinen Weg finden, um eine solche Injektion in OpenLayers-Anfragen zu erreichen. Also habe ich mich für einen Vanille-JS-Ansatz entschieden.
Hier Ich habe diesen Code gefunden ...
(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);
... was ich angepasst habe und anscheinend so aussieht, als ob es sich wie erwartet verhält (nur auf dem letzten Google Chrome getestet).
Da es den Prototyp von XMLHTTPRequest modifiziert, frage ich mich, wie gefährlich dies sein könnte oder ob es ernsthafte Leistungsprobleme verursachen könnte. Und übrigens, gäbe es eine gültige Alternative?
Update: wie Anfragen abgefangen werden, bevor sie gesendet werdenDer vorherige Trick funktioniert in Ordnung. Aber was ist, wenn Sie im selben Szenario einige Header einfügen möchten, bevor die Anfrage gesendet wird? Mach Folgendes:
(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);