我建立与不同的JS库的web应用程序(AngularJS,的OpenLayers,...),并需要一种方法来拦截所有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);
Run Code Online (Sandbox Code Playgroud)
...我改编并看起来像预期的那样(仅在最后一个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);
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以"挂钩"每个AJAX请求(无论是要发送还是事件)并执行操作.此时我假设页面上还有其他第三方脚本.其中一些可能使用jQuery,而另一些则不然.这可能吗?