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 相关文章推荐
pjblog修改技巧汇总
Mar 12 Javascript
JS 图片缩放效果代码
Jun 09 Javascript
jQuery 拖动层(在可视区域范围内)
May 24 Javascript
js常用自定义公共函数汇总
Jan 15 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
Aug 26 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
Jul 18 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
Nov 03 Javascript
Node.js中sequelize时区的配置方法
Dec 10 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
原生JS进行前后端同构
Apr 22 Javascript
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 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设计模式之简单工厂模式详解
2014/09/04 PHP
php常用文件操作函数汇总
2014/11/22 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
JS Date函数整理方便使用
2013/10/23 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
JavaScript中的事件委托及好处
2016/07/12 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
详解Django框架中用context来解析模板的方法
2015/07/20 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
Django异步任务线程池实现原理
2019/12/17 Python
python异步Web框架sanic的实现
2020/04/27 Python
django rest framework 自定义返回方式
2020/07/12 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
2015年酒店工作总结
2015/04/28 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS