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 相关文章推荐
JS 创建对象(常见的几种方法)
Nov 03 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
js取模(求余数)隔行变色
May 15 Javascript
Bootstrap中表单控件状态(验证状态)
Aug 04 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
Sep 21 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
Vue2.0 vue-source jsonp 跨域请求
Aug 04 Javascript
vue cli 3.0 使用全过程解析
Jun 14 Javascript
node.js自动上传ftp的脚本分享
Jun 16 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
JSON基本语法及与JavaScript的异同实例分析
Jan 04 Javascript
javascript canvas实现简易时钟例子
Sep 05 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中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
解析如何用php screw加密php源代码
2013/06/20 PHP
php单一接口的实现方法
2015/06/20 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
七个很有意思的PHP函数
2014/05/12 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
python访问系统环境变量的方法
2015/04/29 Python
在Django的上下文中设置变量的方法
2015/07/20 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
车间主管岗位职责
2013/11/14 职场文书
暑期实践思想汇报
2014/01/06 职场文书
合作协议书范本
2014/10/25 职场文书
八年级英语教学计划
2015/01/23 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
防止web项目中的SQL注入
2021/12/06 MySQL
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA