JS 拦截全局ajax请求实例解析


Posted in Javascript onNovember 29, 2016

你是否有过下面的需求:需要给所有ajax请求添加统一签名、需要统计某个接口被请求的次数、需要限制http请求的方法必须为get或post、需要分析别人网络协议等等,那么如何做?想想,如果能够拦截所有ajax请求,那么问题就会变的很简单!?,少年,想法有点大胆,不过,我欣赏!直接上轮子,Ajax-hook不仅可以满足你想要的,同时可以给你更多。

Ajax-hook源码地址 : https://github.com/wendux/Ajax-hook

如何使用

1.引入ajaxhook.js

<script src="wendu.ajaxhook.js"></script>

2.拦截需要的ajax 回调或函数。

hookAjax({
//拦截回调
onreadystatechange:function(xhr){
console.log("onreadystatechange called: %O",xhr)
},
onload:function(xhr){
console.log("onload called: %O",xhr)
},
//拦截函数
open:function(arg){
console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
}
})

ok, 我们使用jQuery(v3.1) 的get方法来测一下:

// get current page source code 
$.get().done(function(d){
console.log(d.substr(0,30)+"...")
})

结果 :

> open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
> onload called: XMLHttpRequest
> <!DOCTYPE html>
<html>
<head l...

拦截成功了! 我们也可以看到jQuery3.1内部已经放弃onreadystatechange而改用onload了。

API

hookAjax(ob)

  • ob,类型是对象,key为想要拦截的回调或函数,value为我们的拦截函数。
  • 返回值: 原始的 XMLHttpRequest。如果有写请求不想被拦截,可以new 这个。

unHookAjax()

  • 卸载拦截;卸载后,拦截将失效。

改变ajax行为

拦截所有ajax请求,检测请求method,如果是“GET”,则中断请求并给出提示

hookAjax({
open:function(arg){
if(arg[0]=="GET"){
console.log("Request was aborted! method must be post! ")
return true;
}
} 
})

拦截所有ajax请求,请求统一添加时间戳

hookAjax({
open:function(arg){
arg[1]+="?timestamp="+Date.now();
} 
})

修改请求返回的数据“responseText”

hookAjax({
onload:function(xhr){
//请求到的数据首部添加"hook!" 
xhr.responseText="hook!"+xhr.responseText;
}
})

结果:

hook!<!DOCTYPE html>
<html>
<h...

有了这些示例,相信开篇提到的需求都很容易实现。最后测一下unHook

hookAjax({
onreadystatechange:function(xhr){
console.log("onreadystatechange called: %O",xhr)
//return true
},
onload:function(xhr){
console.log("onload called")
xhr.responseText="hook"+xhr.responseText;
//return true;
},
open:function(arg){
console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
arg[1]+="?hook_tag=1";
},
send:function(arg){
console.log("send called: %O",arg[0])
}
})
$.get().done(function(d){
console.log(d.substr(0,30)+"...")
//use original XMLHttpRequest
console.log("unhook")
unHookAjax()
$.get().done(function(d){
console.log(d.substr(0,10))
})
})

输出:

open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
send called: null
onload called
hook<!DOCTYPE html>
<html>
<he...
unhook
<!DOCTYPE

注意

1.拦截函数返回值是一个boolean,如果为true则会阻断ajax请求,默认为false,不会阻断请求。

2.所有的回调拦截函数的参数为当前的XMLHttpRequest 实例,如onreadystatechange、onload;所有ajax原始方法的拦截函数会将原始参数以数组的形式传递给拦截函数,你可以在拦截函数中修改它。

以上所述是小编给大家介绍的JS 拦截全局ajax请求实例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
JavaScript中九种常用排序算法
Sep 02 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
Mar 30 Javascript
jQuery图片加载显示loading效果
Nov 04 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
Vue列表页渲染优化详解
Jul 24 Javascript
vue2.0之多页面的开发的示例
Jan 30 Javascript
JS实现图片切换特效
Dec 23 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
JS正则替换掉小括号及内容的方法
Nov 29 #Javascript
详解堆的javascript实现方法
Nov 29 #Javascript
Bootstrap Table使用心得总结
Nov 29 #Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 #Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 #Javascript
jQuery序列化表单成对象的简单实现
Nov 29 #Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 #Javascript
You might like
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
json跟xml的对比分析
2008/06/10 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
Node.js模块加载详解
2014/08/16 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
深入理解ES6之数据解构的用法
2018/01/13 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python关闭windows进程的方法
2015/04/18 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
django实现前后台交互实例
2017/08/07 Python
基于python的字节编译详解
2017/09/20 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
python如何从文件读取数据及解析
2019/09/19 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python基于execjs运行js过程解析
2020/11/27 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
保险专业大专生求职信
2013/10/26 职场文书
如何写新闻稿
2015/07/18 职场文书
课改心得体会范文
2016/01/25 职场文书
Python IO文件管理的具体使用
2022/03/20 Python