Ich erstelle eine Web-App mit verschiedenen JS-Bibliotheken (AngularJS, OpenLayers, ...) und benötige eine Möglichkeit, alle AJAX-Antworten abzufangen 401 Unauthorized
, um ihn umleiten zu können, falls die protokollierte Benutzersitzung abgelaufen ist (Antwort erhält den Status zurück) zur Anmeldeseite.
Ich weiß, dass AngularJS interceptors
solche Szenarien anbietet , konnte jedoch keinen Weg finden, um eine solche Injektion in OpenLayers-Anforderungen zu erreichen. Also habe ich mich für einen Vanille-JS-Ansatz entschieden.
Hier habe ich 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 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 gibt es übrigens eine gültige Alternative?
Update: So fangen Sie Anforderungen ab, bevor sie gesendet werden
Der vorherige Trick funktioniert in Ordnung. Aber was ist, wenn Sie in derselben Umgebung 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);