首页 > js > 如何接管(拦截)页面所有XHR请求以及响应?

如何接管(拦截)页面所有XHR请求以及响应?

作者:bin

如何用一段代码,就可以接管页面上的所有ajax请求,满足:
1、发起请求是进行拦截、入参修改

2、响应请求时进行拦截、反参修改

3、而且这一段代码只要在谷歌浏览器的console里面执行即可

首先我推荐一个封装好的方法(ajax-hook):https://github.com/wendux/Ajax-hook

怎么用看github上就行,我们直接引入压缩的:https://github.com/wendux/Ajax-hook/blob/master/dist/ajaxhook.min.js

下面是一段拦截网页微信返回消息的方法:

测试页面:https://wx.qq.com/,

操作:登录微信,将下面2段代码复制进console执行,当微信接受到消息时,会将消息打印到console日志中

//引入压缩后的ajax-hook
!function(t){function r(i){if(n[i])return n[i].exports;var e=n[i]={exports:{},id:i,loaded:!1};return t[i].call(e.exports,e,e.exports,r),e.loaded=!0,e.exports}var n={};return r.m=t,r.c=n,r.p="",r(0)}([function(t,r,n){n(1)(window)},function(t,r){t.exports=function(t){t.hookAjax=function(t){function r(r){return function(){var n=this.hasOwnProperty(r+"_")?this[r+"_"]:this.xhr[r],i=(t[r]||{}).getter;return i&&i(n,this)||n}}function n(r){return function(n){var i=this.xhr,e=this,o=t[r];if("function"==typeof o)i[r]=function(){t[r](e)||n.apply(i,arguments)};else{var h=(o||{}).setter;n=h&&h(n,e)||n;try{i[r]=n}catch(t){this[r+"_"]=n}}}}function i(r){return function(){var n=[].slice.call(arguments);if(!t[r]||!t[r].call(this,n,this.xhr))return this.xhr[r].apply(this.xhr,n)}}return window._ahrealxhr=window._ahrealxhr||XMLHttpRequest,XMLHttpRequest=function(){this.xhr=new window._ahrealxhr;for(var t in this.xhr){var e="";try{e=typeof this.xhr[t]}catch(t){}"function"===e?this[t]=i(t):Object.defineProperty(this,t,{get:r(t),set:n(t)})}},window._ahrealxhr},t.unHookAjax=function(){window._ahrealxhr&&(XMLHttpRequest=window._ahrealxhr),window._ahrealxhr=void 0},t.default=t}}]);
//自定义方法
hookAjax({
    onreadystatechange: function (xhr) {
        //判断状态即可在请求不同时间进行逻辑处理,这里是响应请求时进行拦截
        if (xhr.readyState == 4 && xhr.status == 200) { 
            var urlStart = /https:\/\/wx.qq.com\/cgi-bin\/mmwebwx-bin\/webwxsync\?sid=/;
            if (xhr.responseURL.search(urlStart) > -1 && xhr.responseText) {
                console.log(xhr.responseText); //微信返回的消息
            }
        }
    },
});

 

 

您必须 [ 登录 ] 才能发表留言!