当前位置: 首页 > 面试题库 >

拦截XMLHttpRequest并修改responseText

太叔昊穹
2023-03-14
问题内容

我正在尝试构建一个脚本,该脚本将充当本机XMLHttpRequest对象的代理/包装器,使我能够对其进行拦截,修改responseText并返回到原始的onreadystatechange事件。

如果应用正在尝试接收的数据在本地存储中已经存在,则上下文将中止XMLHttpRequest并将本地存储的数据传递回应用成功/失败回调方法。假设我无法控制应用程序现有的AJAX回调方法。

我最初尝试过以下想法。

var send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data){
   //Do some stuff in here to modify the responseText
   send.call(this, data);
};

但是正如我现在确定的那样,responseText是只读的。

然后,我尝试退后一步,向编写自己的完整本机代理XMLHttpRequest,最终最终编写了自己的本机方法版本。类似于此处讨论的内容…

http://www.ilinsky.com/articles/XMLHttpRequest/#implementation-
wrapping

但是它很快变得令人困惑,并且仍然难以将修改后的数据返回到原始onReadyStateChange方法中。

有什么建议?这有可能吗?


问题答案:
//

// firefox, ie8+

//

var accessor = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'responseText');



Object.defineProperty(XMLHttpRequest.prototype, 'responseText', {

    get: function() {

        console.log('get responseText');

        return accessor.get.call(this);

    },

    set: function(str) {

        console.log('set responseText: %s', str);

        //return accessor.set.call(this, str);

    },

    configurable: true

});





//

// chrome, safari (accessor == null)

//

var rawOpen = XMLHttpRequest.prototype.open;



XMLHttpRequest.prototype.open = function() {

    if (!this._hooked) {

        this._hooked = true;

        setupHook(this);

    }

    rawOpen.apply(this, arguments);

}



function setupHook(xhr) {

    function getter() {

        console.log('get responseText');



        delete xhr.responseText;

        var ret = xhr.responseText;

        setup();

        return ret;

    }



    function setter(str) {

        console.log('set responseText: %s', str);

    }



    function setup() {

        Object.defineProperty(xhr, 'responseText', {

            get: getter,

            set: setter,

            configurable: true

        });

    }

    setup();

}


 类似资料:
  • 拦截文件 bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) bp GetPrivateProfileStringA (ini文件)

  • 拦截时间 bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数

  • 拦截窗口 bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本

  • 我想拦截改造引擎收到的所有响应,并扫描HTTP错误代码,例如错误403。 我知道我可以使用每个请求的failure(reformationerror error)回调并检查403,但我想将响应打包为全局响应。 我可以看到请求拦截是可能的,但我看不到类似的响应选项。 有什么建议吗?

  • You can enable changing of locales by adding the LocaleChangeInterceptor to one of the handler mappings (see [Section 21.4, "Handler mappings"](mvc.html the request and change the locale. It calls set

  • 拦截注册表 bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健