我正在使用不同的 JS 库(AngularJS、OpenLayers 等)构建一个 Web 应用程序,并且需要一种方法来拦截所有 AJAX 响应,以便在登录的用户会话过期(响应返回401 Unauthorized
状态)的情况下重定向他到登录页面。
我知道 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);