我正在用不同的 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);