Ajax-hook是一款非常方便的JS库,在前后端交互中起到了非常重要的作用。本文将从ajaxhook原理、ajaxhookjs、ajaxhook用法、ajaxhook使用示例、ajaxhook把请求挂起、ajaxhook全局加解密等多个方面对其进行详细的阐述。
一、ajaxhook原理
ajaxhook库可以通过拦截XMLHttpRequest对象来捕获前端HTTP请求,并再请求被发送前做出更改。其核心代码如下:
(function () {
var XHR = XMLHttpRequest.prototype;
var open = XHR.open;
var send = XHR.send;
...
})();
上述代码通过重新定义XMLHttpRequest.prototype对象中的open、send两个方法,来将拦截到的HTTP请求进行修改处理。
二、ajaxhookjs
ajaxhookjs是一个能够将ajax-hook引入到项目中的JS文件。其使用方法非常简单,只需要在HTML的中添加下面代码即可:
<!-- ajaxhook.js -->
<script src="ajaxhook.js"></script>
三、ajaxhook用法
ajaxhook用法非常简单,只需要在需要拦截的请求前添加上hook即可:
function fn (ajax) {
return function (data) {
// Do something here
return ajax.apply(this, arguments);
};
}
// Hook jQuery's ajax method
$.ajax = fn($.ajax);
上述代码是通过拦截jQuery库中的ajax方法来进行示范的。其中fn函数用来对请求进行定制化的处理,如全局加解密等。然后将该函数注入ajax方法中,即可实现对所有请求的拦截效果。
四、ajaxhook使用示例
1、hook请求头
我们可以通过hook方法来修改请求头信息:
function fn (ajax) {
return function (data) {
// Do something here
data.headers['Authorization'] = 'Bearer ' + token; // 修改token信息
return ajax.apply(this, arguments);
};
}
// Hook jQuery's ajax method
$.ajax = fn($.ajax);
2、hook请求体
我们也可以通过hook方法来修改请求体:
function fn (ajax) {
return function (data) {
// Do something here
data.data = encrypt(data.data); // 数据加密
return ajax.apply(this, arguments);
};
}
// Hook jQuery's ajax method
$.ajax = fn($.ajax);
3、hook响应信息
还可以通过hook方法来对响应信息进行修改:
function fn (ajax) {
return function (data) {
// Do something here
var defer = new $.Deferred();
ajax(data).done(function (response) {
response.result = decrypt(response.result); // 解密响应信息
defer.resolve(response);
});
return defer.promise();
};
}
// Hook jQuery's ajax method
$.ajax = fn($.ajax);
五、ajaxhook把请求挂起
在某些时候,我们需要将异步请求挂起,等待其他异步操作完成之后再继续执行。使用ajaxhook,我们只需要在拦截到请求后,将请求挂起即可:
(function () {
var XHR = XMLHttpRequest.prototype;
var open = XHR.open;
var send = XHR.send;
XHR.open = function (method, url, async) {
this._url = url;
open.call(this, method, url, async);
};
XHR.send = function (data) {
var _this = this;
var oldOnReadyStateChange;
var url = this._url;
function onReadyStateChange() {
if (this.readyState === 1) {
var hookData = {method: _this._method, url: url, data: data};
// Hook the request with the hook function
hook(hookData, function () {
_this._data = hookData.data;
send.call(_this, _this._data);
});
oldOnReadyStateChange.apply(this, arguments);
}
}
if (!this.addEventListener) {
oldOnReadyStateChange = this.onreadystatechange;
this.onreadystatechange = onReadyStateChange;
} else {
this.addEventListener("readystatechange", onReadyStateChange);
}
};
})();
上述代码中的hook
函数中,我们可以实现将异步请求挂起,等待其他异步操作完成之后,再继续执行该请求。具体的操作方法详见以上代码实现。
六、ajaxhook全局加解密
在实际开发过程中,我们经常会需要对前端与后台交互的数据进行加解密操作,这时候我们可以使用ajaxhook来实现全局加解密。 首先,我们需要在请求体的hook方法中,将所有的请求数据进行加密操作:
function encryptData(data) {
return CryptoJS.AES.encrypt(data, '123456').toString(); // 加密方式为AES加密
}
function fn (ajax) {
return function (data) {
data.data = encryptData(data.data);
return ajax.apply(this, arguments);
}
然后,在响应信息的hook方法中,将所有返回的数据进行解密操作:
function decryptData(data) {
return CryptoJS.AES.decrypt(data, '123456').toString(CryptoJS.enc.Utf8);
}
function fn (ajax) {
return function (data) {
var defer = new $.Deferred();
ajax(data).done(function (response) {
response.result = decryptData(response.result);
defer.resolve(response);
});
return defer.promise();
};
}
以上就是ajaxhook全局加解密的实现方法。我们可以在项目中,将加解密方法进行封装,然后在请求和响应的hook方法中统一调用,实现全局加解密的效果。