拦截Chrome for iOS上的AJAX请求?

时间:2015-03-27 21:14:14

标签: javascript ios ajax chrome-ios

我通过更改XMLHttpRequest.prototype opensend方法拦截了我网站中的AJAX请求。这种方法在我测试的所有浏览器中都没有任何麻烦。然而,当谈到Chrome for iOS(iPhone)时,代码有一个最怪异的错误:它就像它不断激发我在原型中改变的代码(显然最终会崩溃)。

这是我正在做的一个超级极小的例子:

var open = XMLHttpRequest.prototype.open; // Caching the original
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    alert('open'); // Here is my code
    open.call(this, method, url, async, user, pass); // Calling the original
 };

我已经组建了一个小的JSBin,只是你可以在iOS上访问你的Chrome: Demo

根据this回答,我正在使用的代码(与该答案中的一个OP基本相同)是安全的,应该没有理由担心。而且,事实上,Chrome for iOS是唯一表现奇怪的浏览器。

这让我疯了两天,任何建议或解决方法都表示赞赏。

1 个答案:

答案 0 :(得分:3)

如何在Chrome for iOS上拦截AJAX请求

这是适用于大多数浏览器的XMLHttpRequest拦截代码:

(function(open) {
  XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    // Intercept the open request here
    alert("Intercepted: " + url);
    open.apply(this, arguments);
  };
})(XMLHttpRequest.prototype.open);

xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","http://google.com",true);
xmlhttp.send();

Chrome for iOS存在问题。它已在下面提出并进行了调查。我将为重复的open()电话"提供解释。错误,演示和解决方法。

从上一篇文章:

  

在页面加载时,Chrome会向服务发出两个异步请求   它可能是在本地运行。通过URL的声音   请求,这些服务用于确保页面的安全性   你正在访问。

以下是Chrome正在尝试访问的一个此类本地网址的屏幕截图(Demo):

Repeated Chrome calls

Chrome会定期对其XMLHttpRequest.open()进行调用。这些对拦截代码的重复调用不是由拦截代码本身引起的;它们是由Chrome浏览器中无关且重复的电话引起的。我已经确定了两个这样的网址。可能还有其他人。

根据我的研究,此解决方法使Chrome for iOS上的XMLHttpRequest代码拦截工作。请参阅此JSBin测试演示。它将演示如何这些重复的调用。从本质上讲,拦截代码应该忽略Chrome使用的URL。

(function(open) {
  XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    var d1 = document.getElementById('urls');

    // Avoid intercepting Chrome on iOS local security check urls
    if(url.indexOf("/chromecheckurl") < 0 && url.indexOf("/chrome") !== 0) {
        // These are what we want to intercept
        d1.insertAdjacentHTML('beforeend', '<b>'+url+'</b><br/>');
    } else {
        // These are the internal Chrome requests - we can ignore them
        d1.insertAdjacentHTML('beforeend', '<i>'+url+'</i><br/>');
    }

    open.apply(this, arguments);
  };
})(XMLHttpRequest.prototype.open);


xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","http://google.com",true);
xmlhttp.send();

这是我尝试解释此问题的最佳尝试&#34;重复open()来电&#34; Chrome for iOS上的错误以及解决方法。