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是怎么继承的介绍
Jan 05 Javascript
一个JavaScript递归实现反转数组字符串的实例
Oct 14 Javascript
JavaScript实现的浮动层框架用法实例分析
Oct 10 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 Javascript
js 倒计时(高效率服务器时间同步)
Sep 12 Javascript
关于vue单文件中引用路径的处理方法
Jan 08 Javascript
layui 监听表格复选框选中值的方法
Aug 15 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
Sep 24 Javascript
JavaScript Reflect Metadata实现详解
Dec 12 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跨站刷票的实现代码
2013/06/18 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
Postman参数化实现过程及原理解析
2020/08/13 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python实现的文件夹清理程序分享
2014/11/22 Python
Python实现简单的语音识别系统
2017/12/13 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
Django更新models数据库结构步骤
2020/04/01 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
策划总监岗位职责
2014/02/16 职场文书
行政副总岗位职责
2014/02/23 职场文书
贷款委托书范本
2014/04/08 职场文书
推广普通话演讲稿
2014/05/23 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
租房协议书范例
2014/10/14 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Window server中安装Redis的超详细教程
2021/11/17 Redis
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL