我正在使用不同的JS库(AngularJS、OpenLayers等)构建一个web应用程序,需要一种截获所有AJAX响应的方法,以便在登录的用户会话过期的情况下(响应以401 Unauthorized状态返回),将其重定向到登录页面
我知道AngularJS提供了拦截器来管理这样的场景,但是没有找到一种方法来实现对OpenLayers请求的注入。所以我选择了一种普通的JS方法
在这里我找到了这段代码
(功能(打开){
XMLHttpRequest.prototype.open=函数(方法、url、异步、用户、传递){
addEventListener(“readystatechange”,function()){
console.log(this.readyState);//我更改了这个
},假);
调用(this、方法、url、async、user、pass);
};
})(XMLHttpRequest.prototype.open);
…我对它进行了修改,看起来它的行为和预期的一样(只在上一次谷歌Chrome上进行了测试)
当它修改XMLHTTPRequest的原型时,我想知道这会有多危险,或者是否会产生严重的性能问题。顺便问一下,还有什么有效的替代方案吗
更新:如何在发送请求之前拦截请求
上一个技巧很有效。但是,如果在同一场景中,您希望在发送请求之前插入一些头,该怎么办?请执行以下操作:
(功能(发送){
XMLHttpRequest.prototype.send=函数(数据){
//在本例中,我将在请求头中注入一个访问令牌(例如accessToken),然后再发送
if(accessToken)这个.setRequestHeader('x-access-token',accessToken);
发送.呼叫(此,数据);
};
})(XMLHttpRequest.prototype.send);
这种类型的函数挂钩是完全安全的,并且由于其他原因,经常使用其他方法进行
而且,唯一的性能影响实际上是每个.open()只需要一个额外的函数调用,加上您自己执行的任何代码,当涉及网络调用时,这些代码可能并不重要
在IE中,这不会捕获任何试图使用Ajax的ActiveXObject控制方法的代码。编写良好的代码首先查找XMLHttpRequest对象,并使用该对象(如果可用)以及自IE7以来就可用的对象。但是,如果有ActiveXObject方法,可能会有一些代码使用该方法,这在IE的更高版本中是正确的
在现代浏览器中,还有其他方法可以发出Ajax调用,如fetch()接口,因此,如果要钩住所有Ajax调用,您必须钩住的不仅仅是XMLHttpRequest