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 相关文章推荐
Google韩国首页图标动画效果
Aug 26 Javascript
js创建数据共享接口——简化框架之间相互传值
Oct 23 Javascript
javascript中parseInt()函数的定义和用法分析
Dec 20 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
JavaScript实现基于Cookie的存储类实例
Apr 10 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
关于Promise 异步编程的实例讲解
Sep 01 Javascript
js生成word中图片处理方法
Jan 06 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
Nov 28 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
JQuery Ajax如何实现注册检测用户名
Sep 25 jQuery
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下打开URL地址的几种方法小结
2010/05/16 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
php格式化电话号码的方法
2015/04/24 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
微信小程序之GET请求的实例详解
2017/09/29 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
python使用socket进行简单网络连接的方法
2015/04/29 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
信息工程学院毕业生推荐信
2013/11/05 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python