Coder Social home page Coder Social logo

ajax-hook's Introduction

ajax-hook's People

Contributors

aysnine avatar cyfung1031 avatar dahuiaaaaa avatar wendux avatar zjsxdyw avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ajax-hook's Issues

【BUG】属性拦截无效

                //If the attribute isn't writable, generate proxy attribute
                var attrSetterHook = (hook || {})["setter"];
                v = attrSetterHook && attrSetterHook(v, that) || v
                try {
                    xhr[attr] = v;
                } catch (e) {
                    this[attr + "_"] = v;
                }

这里有严重的BUG。
1.非严格模式下,是没有异常抛出的。
2.很多属性是访问器属性,只不过set方法是undefined。比如response,responseText,最新版本做不到拦截这类属性。

方法的HOOK,为什么在方法代理的时候不把返回值也返回呢

现在:
function hookFunction(fun) {
return function () {
var args = [].slice.call(arguments);
if (proxy[fun] && proxy[fun].call(this, args, this.xhr)) {
return;
}
return this.xhr[fun].apply(this.xhr, args);
};
}

期望:
function hookFunction(fun) {
return function () {
var args = [].slice.call(arguments);
if (proxy[fun]) {
return proxy[fun].call(this, args, this.xhr);
}
return this.xhr[fun].apply(this.xhr, args);
};
}

ajax同步请求拦截

请问怎么拦截同步的请求呢,因为同步请求不会触发onreadystatechange。

美团外卖做了防Hook。

Uncaught RangeError: Maximum call stack size exceeded

代码位置:
function o(t) {
function e(e) {
return function() {//这里会报递归调用
var r = this.hasOwnProperty(e + "") ? this[e + ""] : this.xhr[e],
n = (t[e] || {}).getter;
return n && n(r, this) || r
}
}

想知道该如何解决?

IE 兼容性问题

其他浏览器没有问题,IE碰到了个奇怪的问题

“Inspector returns the error: Object doesn't support this action”

Debug后发现是xor-proxy.js 文件 triggerListenner方法最后的getEventType(xhr).dispatchEvent抛出的异常

参考这个问题 https://stackoverflow.com/questions/27176983/dispatchevent-not-working-in-ie11

修改成

var evt;
if(typeof(Event) === 'function') {
    evt = new Event(name);
} else {
    evt = document.createEvent('Event');
    evt.initEvent(name, false, true);
}
getEventTarget(xhr).dispatchEvent(evt);

解决了这个IE兼容性问题,

要是作者有时间的话可以拿IE试一下。

请教:拦截jsonp请求

楼主这个东西很好用,在之前的项目中用上了:)

现在的需求是要拦截jsonp请求,楼主的这个就用不上了,想了半天没好办法,所以特来请教下,不知有什么思路吗?

timeout问题

hookAjax({
            ontimeout: function(){
                console.log('timeout');
            }
        })
        $.ajax({
            url: '任意接口',
            timeout: 1000,
        })

将浏览器调到慢网 是不是应该预期显示timeout?目前没有显示

如何捕获error

如题,如果网络断开了,这个时候原生可以监听到error事件,那么这里该如何处理?

如何在send阶段获取url

hook以后相对数据进行加密,但是加密需要根据不同的url来判断。怎么在send阶段拿到url呢?

Object.defineProperty responseText在android 5.1 oppo 中无效,导致异步请求无法获取数据

系统

手机名称:OPPO A59S
colorOs:v 3.0
Android:5.1

表现

无法获取请求返回数据,

原因

通过Object.defineProperty设置的属性response, responseText 不生效,需要显示的
在onreadystatechange 中手动设置
https://github.com/wendux/Ajax-hook/blob/master/src/ajaxhook.js#L48
之前添加

if (attr === 'onreadystatechange') {                   
    that.responseText = that.xhr.responseText;
    that.response = that.xhr.response;
}

iframe的请求hook问题

请问下这个库是否支持hook到同一个页面,内嵌iframe子页面的所有xmlHttpRequest请求呢?谢谢

使用之后同步请求不在同步

使用proxy进行拦截以后,发现之前设置的同步请求在会同步执行了,看起来更像是异步执行,取消掉proxy能够正常执行,但是加上这个就像异步执行了。

另外设置config.withCredentials=true 好像无效, 通过设置config.xhr.withCredentials=true 才能生效,不知道是我用法不对还是有bug

onabort问题

hookAjax({
onabort: function(){
                console.log('abort');
            }
})
 $.ajax({
            url: '任意接口',
            timeout: 1000
        })

慢网下触发onabort 同时报错:
image

Access to request FormData

Hi
Is it possible to get read access to the request body when using POST/PUT request with the request url?
The xhr object does not contain this data
Closest I got to is:

ah.hookAjax({
    send:function(arg,xhr){
         console.log("send args = %s", arg.join()); //body, but no url
    },
    onreadystatechange:function(xhr){
        console.log("responseURL: %s", xhr.responseURL); //url, but no request body
});

Is there a way to get both request-body and request-url in same context?

Thanks!

在onreadystatechange函数里打印readyState未出现过 1 的状态

想在readyState为1(open方法已经被调用,但还没调用send方法)时调用setRequestHeader方法设置header,但在onreadystatechange里打印readyState,从未出现过为1的状态,想请教下是什么原因,谢谢。

代码如下:
image

以下是在控制台打印的结果:
image

支持ie8吗

在ie8下不支持default属性,加载js有问题,这个可以解决吗

建议添加 Object.keys(XMLHttpRequest)

(function() {
	for (var p in window._ahrealxhr) {
		Object.defineProperty(XMLHttpRequest, p, {
			get: function() {
				return window._ahrealxhr[p]
			},
			set: function() {}
		})
	}

})()

更贴近XMLRequest

总是提示跨域错误

code

ah.proxy({
  //请求成功后进入
  onResponse: (response, handler) => {
    console.log("ceshi-----")
    console.log(response)
    if (response.config.url.startsWith('https://zhihu-web-analytics.zhihu.com/api/v1')) {
      console.log("88888")
      axios.post('http://localhost/receiver/movie', {
        url: window.location.href,
        data: response.response
      }, {
        headers: {
          'Content-Type': 'application/json'
        }
      })
      console.log(response.response)
      console.log(typeof response)
      console.log(response)
      handler.next(response)
    }
  }
})

console error

ajax-hook

timeout设置无效

timeout属性设置后会被代理成timeout_属性,虽然有对timeout做get劫持,但是貌似xhr内部在处理超时的时候并没有取timeout_这个属性,而是仍然取得是timeout属性,导致属性失效,估计设置withCredential也会出现同样的问题。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.