前言

在制作插件的过程中很多情况是需要hook的,下面是常见的hook方法

let xml=window.XMLHttpRequest;
window.XMLHttpRequest=function(){
   return xml.apply(this,arguments);
}

以上这种hook针对常见的ajax的确很管用,但是针对在内部生成了新的XMLHttpRequest的代码就会导致hook之前的代码不会进入我们的方法,只有hook之后的方法才会。那么我们怎么让所有的ajax都会进我们的方法呢?答案就是原型链。
我们Hook掉原型链open方法,这样所有打开都会调用我们的代码了,那么为什么是open方法呢?因为所有ajax请求都会调用open方法。

代码

let open=window.XMLHttpRequest.prototype.open;
    Object.defineProperty(window.XMLHttpRequest.prototype,'open',{
        get(){
            return function(type,url){
                let ret=open.apply(this,arguments);
                if(url.includes('rptBpp4pBidwordDayList')){
                    let xhr=this;
                    let baseCallback=xhr.onreadystatechange;
                    function hk(){
                        if(xhr.readyState == 4 && xhr.status == 200){
                            try{
                                callback(JSON.parse(xhr.responseText))
                            }catch (e) {

                            }
                        }
                        return baseCallback && baseCallback.apply(this,arguments);
                    }
                    xhr.onload=hk;
                    Object.defineProperty(xhr,'onload ',{
                        get(){
                            return hk;
                        },
                        set(val){
                            baseCallback=val;
                        },
                    });
                }
                return ret;
            };
        }
    })

标签: hook, ajax hook

添加新评论