拦截Chrome OS上的AJAX请求?

我通过改变XMLHttpRequest.prototype opensend方法来拦截我的网站中的AJAX请求。 这个方法在我testing的所有浏览器中都没有任何麻烦。 然而,当谈到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

根据这个答案,我使用的代码(基本上与该答案中的一个OP相同)将是安全的,应该没有理由担心。 而且,事实上,Chrome for iOS是唯一performance得exception的浏览器。

这已经让我坚持了两天,任何build议或解决方法表示赞赏。

如何拦截iOS上的Chrome的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()调用”错误,演示和解决方法的解释。

  • 修改XMLHttpRequest原型使其在iOS版Chrome中持续启动

  • 疯狂的事情,我们发现开发新的遗物浏览器

  • iOS上的Chrome可能会占用您的全局variables!

从最后的参考:

在页面加载时,Chrome会向服务发出两个asynchronous请求,大概是本地运行的。 通过所请求的URL的声音,这些服务用于确保您正在访问的页面的安全性。

以下是Chrome试图访问的一个此类本地url的截图( Demo ):

重复的Chrome通话

Chrome会自行定期调用XMLHttpRequest.open() 。 这些对拦截代码的重复调用不是由拦截代码本身引起的; 它们是由Chrome浏览器不相关的重复呼叫造成的。 我已经确定了两个这样的url。 可能有其他的。

  • / chromeforiossecurity / b86 … 98d /
  • HTTPS:// localhost:0程序/ chromecheckurl

从我的研究中,这个解决方法使得XMLHttpRequest代码拦截在Chrome for iOS上可以工作 。 看到这个JSBintesting演示。 这将显示这些重复的呼叫是如何发生的。 本质上,拦截代码应忽略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(); 

这是我最好的尝试,解释关于这个“在Chrome浏览器上重复open()调用”的错误,以及解决方法。