Javascript - 拦截所有XHR和非XHR调用

时间:2017-06-17 15:46:04

标签: javascript ajax xmlhttprequest activex

我试图拦截所有类型的通话。我甚至在stackoverflow上找到了一些关于它的指南和问题。遗憾的是,所有这些都是关于拦截XHR调用(使用XMLHTTPrequest或/和ActiveXObject)。我需要做的是拦截所有类型的调用(即使浏览器开发人员工具指示为不同类型的调用[不是XHR ],例如:文档,脚本或其他)并保存一些信息localStorage的。 我无法使用JQuery

我的代码:

 var xml_type;
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest && !(window.ActiveXObject==undefined)) {

    xml_type = 'XMLHttpRequest';

// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
    try {

        x = new ActiveXObject('Msxml2.XMLHTTP');

        xml_type = 'Msxml2.XMLHTTP';

    } catch (e) {

        x = new ActiveXObject('Microsoft.XMLHTTP');

        xml_type = 'Microsoft.XMLHTTP';

    }

}


var ActualActiveXObject = window.ActiveXObject;
var ActiveXObject;

if (xml_type == 'XMLHttpRequest') {

    (function (open) {
        if (s_ajaxListener === undefined) {

            var s_ajaxListener = new Object();
            s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
            s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
            s_ajaxListener.callback = function () {
                // this.method :the ajax method used
                // this.url    :the url of the requested script (including query string, if any) (urlencoded)
                // this.data   :the data sent, if any ex: foo=bar&a=b (urlencoded)
            };

            XMLHttpRequest.prototype.open = function (a, b) {
                if (!a) a = '';
                if (!b) b = '';

                s_ajaxListener.tempOpen.apply(this, arguments);
                s_ajaxListener.method = a;
                s_ajaxListener.url = b;

                var xhr = this;
                xhr.openTime= new Date().getTime();

                setRequest(xhr.openTime, a, b);

                if (a.toLowerCase() == 'get') {
                    s_ajaxListener.data = b.split('?');
                    s_ajaxListener.data = s_ajaxListener.data[1];
                }
            };

            XMLHttpRequest.prototype.send = function (a, b) {
                if (!a) a = '';
                if (!b) b = '';
                s_ajaxListener.tempSend.apply(this, arguments);
                if (s_ajaxListener.method.toLowerCase() == 'post') s_ajaxListener.data = a;

                var xhr = this;
                var interval = setInterval(function () {
                    if (xhr.readyState === 4) {
                        setResponse(xhr, a);
                        clearInterval(interval);
                    }
                }, 200);

                s_ajaxListener.callback();
            };

        }
    })(XMLHttpRequest.prototype.open);

} else {

    ActiveXObject = function (progid) {
        console.log("progid ", progid);
        var ax = new ActualActiveXObject(progid);

        if (progid.toLowerCase() == "microsoft.xmlhttp") {
            var o = {
                _ax: ax,
                _status: "fake",
                responseText: "",
                responseXml: null,
                readyState: 0,
                dataType: 'plain',
                status: 0,
                statusText: 0,
                onReadyStateChange: null,
                onreadystatechange: null
            };
            o._onReadyStateChange = function () {
                var self = o;
                return function () {
                    self.readyState = self._ax.readyState;
                    if (self.readyState == 4) {

                        self.responseText = self._ax.responseText;
                        self.responseXml = self._ax.responseXml;
                        self.status = self._ax.status;
                        self.statusText = self._ax.statusText;

                        setResponse(self, self.responseText);

                    }
                    if (self.onReadyStateChange) {
                        self.onReadyStateChange();
                    }
                    if (self.onreadystatechange) {
                        self.onreadystatechange();
                    }
                }
            }();
            o.open = function (bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword) {
                this._ax.onReadyStateChange = this._onReadyStateChange;
                this._ax.onreadystatechange = this._onReadyStateChange;
                o.openTime = new Date().getTime();
                setRequest(o, bstrMethod, bstrUrl);
                return this._ax.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
            };
            o.send = function (varBody) {
                return this._ax.send(varBody);
            };
            o.abort = function () {
                return this._ax.abort();
            }
            o.setRequestHeader = function (k, v) {
                return this._ax.setRequestHeader(k, v)
            }
            o.setrequestheader = function (k, v) {
                return this._ax.setRequestHeader(k, v)
            }
            o.getResponseHeader = function (k) {
                return this._ax.getResponseHeader(k)
            }
            o.getresponseheader = function (k) {
                return this._ax.getResponseHeader(k)
            }

        } else if (progid.toLowerCase() == "msxml2.xmlhttp") {
            var o = {
                _ax: ax,
                _status: "fake",
                responseText: "",
                responseXml: null,
                readyState: 0,
                dataType: 'plain',
                status: 0,
                statusText: 0,
                onReadyStateChange: null,
                onreadystatechange: null
            };
            o._onReadyStateChange = function () {
                var self = o;
                return function () {
                    self.readyState = self._ax.readyState;
                    if (self.readyState == 4) {

                        self.responseText = self._ax.responseText;
                        self.responseXml = self._ax.responseXml;
                        self.status = self._ax.status;
                        self.statusText = self._ax.statusText;

                    }
                    if (self.onReadyStateChange) {
                        self.onReadyStateChange();
                    }
                    if (self.onreadystatechange) {
                        self.onreadystatechange();
                    }
                }
            }();
            o.open = function (bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword) {
                this._ax.onReadyStateChange = this._onReadyStateChange;
                this._ax.onreadystatechange = this._onReadyStateChange;
                alert('Intercept');
                return this._ax.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
            };
            o.send = function (varBody) {
                return this._ax.send(varBody);
            };
            o.abort = function () {
                return this._ax.abort();
            }
            o.setRequestHeader = function (k, v) {
                return this._ax.setRequestHeader(k, v)
            }
            o.setrequestheader = function (k, v) {
                return this._ax.setRequestHeader(k, v)
            }
            o.getResponseHeader = function (k) {
                return this._ax.getResponseHeader(k)
            }
            o.getresponseheader = function (k) {
                return this._ax.getResponseHeader(k)
            }

        } else {
            var o = ax;
        }

        return o;
    }
}

setRequestsetResponse只是在localStorage中保存数据的函数。

此代码拦截所有XHR请求但不拦截其他请求,我需要拦截所有请求。

提前致谢

0 个答案:

没有答案