私はさまざまなJSライブラリ(AngularJS、OpenLayersなど)を使用してWebアプリを構築しており、ログに記録されたユーザーセッションが期限切れになった場合(応答が401 Unauthorized
ステータスで戻る)にリダイレクトできるように、すべてのAJAX応答をインターセプトする方法が必要ですログインページへ。
AngularJSがinterceptors
そのようなシナリオを管理するために提供していることを知っていますが、OpenLayersリクエストへのそのような注入を実現する方法を見つけることができませんでした。だから私はバニラJSアプローチを選びました。
ここで私はこのコードを見つけました...
(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);
...私はそれを適応させ、期待どおりに動作するように見えます(最後のGoogle Chromeでのみテストしました)。
XMLHTTPRequestのプロトタイプを変更するときに、これがどれほど危険であるか、または深刻なパフォーマンスの問題を引き起こす可能性があるのかと思います。そしてところで、有効な代替案はありますか?
更新:リクエストが送信される前にインターセプトする方法
前のトリックは大丈夫です。しかし、同じシナリオで、リクエストが送信される前にヘッダーを挿入したい場合はどうでしょうか?以下をせよ:
(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);