浏览器请求拦截
对 window.XMLHttpRequest
对象的重写
- 拦截请求入参(通过修改
send
方法修改)
class XMLHttpRequestInter extends window.XMLHttpRequest {
constructor(...args) {
super(...args);
}
send(...params) {
const yourParams = [] // 你的参数处理逻辑
// 发送你的参数
super.send(...yourParams);
}
}
window.XMLHttpRequest = XMLHttpRequestInter;
- 拦截请求回来的数据
class XMLHttpRequestInter extends window.XMLHttpRequest {
constructor(...args) {
super(...args);
}
open(...params) {
// 获取到请求url
const url = params[1];
// 你的判断逻辑
...
// 满足条件修改返回数据
if (条件 === true) {
const originalOnReadyStateChange = super.onreadystatechange;
super.onreadystatechange = () => {
if (this.readyState === 4 && this.status === 200) {
// 获得返回值
const res = super.response;
// 你的数据
const yourRes = ...;
this.response = yourRes;
}
originalOnReadyStateChange.call(this);
};
}
return super.open(...params);
}
}
window.XMLHttpRequest = XMLHttpRequestInter;
Fiddler
方法名 |
描述 |
示例 |
FiddlerObject.alert(ebody) |
fiddler script alert 方法 |
:---------------------------------- |
拦截请求入参
-
OnBeforeRequest(oSession: Session)
方法名 |
描述 |
示例 |
GetRequestBodyAsString |
获取字符串形式的请求体 |
'[{"actionType":"initUser"}]' |
Fiddler.WebFormats.JSON.JsonDecode(GetRequestBodyAsString()) |
将获取字符串形式的请求体转化为 JSON |
[{"actionType":"initUser"}] |
function OnBeforeRequest(oSession) {
const rqbody = oSession.GetRequestBodyAsString();
if (rqbody.Contains('your string')) {
// 解析请求体为 JSON 格式
const rqbodyJSON = Fiddler.WebFormats.JSON.JsonDecode(rqbody);
// 修改请求体参数
rqbodyJSON.JSONObject["params"]["loginName"] = "new name";
// 转换请求体为请求格式
const rqbodyChanged = Fiddler.WebFormats.JSON.JsonEncode(rqbodyJSON.JSONObject);
// 修改 oSession 请求体
oSession.utilSetRequestBody(rqbodyChanged);
}
}
拦截响应数据
-
OnBeforeResponse(oSession: Session)
方法名 |
描述 |
示例 |
GetResponseBodyAsString |
获取字符串形式的响应体 |
'[{"actionType":"initUser"}]' |
Fiddler.WebFormats.JSON.JsonDecode(GetResponseBodyAsString()) |
将获取字符串形式的响应体转化为 JSON |
[{"actionType":"initUser"}] |
function OnBeforeResponse(oSession) {
const rsbody = oSession.GetResponseBodyAsString();
if (rsbody.Contains('your string')) {
// 解析响应数据为 JSON 格式
const rsbodyJSON = Fiddler.WebFormats.JSON.JsonDecode(rsbody);
// 修改响应数据
rsbodyJSON.JSONObject["proName"] = "new name";
// 转换响应体为标准格式
const rsbodyChanged = Fiddler.WebFormats.JSON.JsonEncode(rsbodyJSON.JSONObject);
// 注意:这里应该使用 `oSession.utilSetResponseBody(rsbodyChanged);` 而不是 `rqbodyChanged`
oSession.utilSetResponseBody(rsbodyChanged);
}
}
whistle
- 查看拦截界面:
http://local.whistlejs.com/
- 通过配置 host 进行抓包
- 请求体只能获取 16k
- 参考地址:
http://wproxy.org/whistle/