2012-12-04 83 views
0

我使用下面的JavaScript代码来拦截AJAX调用:
https://example.com/js/main.js
https://example.com/js/intercept.jsJavaScript的AJAX拦截

XMLHttpRequest.prototype.realOpen = XMLHttpRequest.prototype.open; 
var newOpen = function(method, url, async, user, password) { 
    console.log("Intercepted open (" + url + ")"); 
    this.realOpen(method, url, async, user, password); 
} 
XMLHttpRequest.prototype.open = newOpen; 

其执行AJAX调用和上述代码中的JavaScript从装载上述代码在ajax调用的域只是“example.com”的情况下工作良好,但是当为域“sub.example.com”调用ajax时,以上代码无法截获该请求。

有人知道为什么它不起作用吗?

+0

你是什么意思“不工作”,这是一个跨域请求,这样做时应该有一个例外。 – xiaoyi

+0

否控制台上没有错误/异常。通过“不工作”,我的意思是在那里“sub.example.com”的Ajax请求不被拦截,我没有看到它的console.log条目。我知道这是要求肯定的,因为我通过Fiddler代理所有浏览器流量。 – yatin

+0

[CORS](https://developer.mozilla.org/en-US/docs/HTTP_access_control)由两个请求组成,首先检查另一个页面是否允许来自当前域的请求,然后在第二个请求中发送实际请求一。所以如果你只看到一个,就有问题。 – xiaoyi

回答

1

看起来你是same origin policy的受害者,因为example.com和sub.example.com被认为是两个不同的域。

+0

我明白了,所以如果我添加一个带有相同脚本的iframe,将document.domain设置为iframe的“sub.example.com”,那么它会起作用。 – yatin

+0

是的,但是您必须弄清楚如何在主窗口和iframe之间进行通信(使用跨域消息等技术)。此外,像CORS或JSONP这样的技术可以绕过跨域问题,但它们在所有浏览器或服务器中都不受支持。 – Christophe