AJAX javascript的跨域访问执行
在网站加载评论等信息时,遇到了不同域名间JavaScript无法交互的问题。当尝试加载评论时,页面一直显示加载状态,无法正确显示内容。当更换访问时,却能正常显示。一直未引起注意的是,浏览器提示的错误信息中隐藏了问题的关键。
深入研究后,发现这其实是一个关于跨域请求阻塞的问题。为了验证请求的阻塞情况,我们连续发起了三个请求。每个请求需要大约1.5秒的时间,而第三个请求必须等待前两个请求完成后才能执行,导致总时间超过3秒。我们需要解决的就是这种情况。
传统的跨域异步请求解决方案存在限制。AJAX跨域请求的安全性限制似乎是一个无法逾越的障碍。除非在本地硬盘上打开网页或在IE中打开跨域数据传输的限制,否则向其他域名发起AJAX请求会被禁止。即使是同一域名的不同子域名或不同端口,也被视为不同的域名,无法向其资源发起AJAX请求。
表面上看起来,似乎没有办法打破这个限制。幸运的是,iframe成为了我们的救星。虽然iframe不在标准中,但由于其实用性,得到了浏览器的广泛支持。网上已经出现了一些跨域异步请求的做法,它们虽然做法简单,但存在一些缺陷。这些做法的基本原理是:在另一个域名下放置一个特定的页面作为Proxy,主页面将异步请求的信息通过查询字符串传递给iframe中的Proxy页面。Proxy页面完成AJAX请求后,将结果放在自己的URL的hash中。主页面则轮询iframe的src的hash值,一旦发现变化,就通过hash值获取所需的信息。
这个方法的实现相对复杂,且功能受限。在IE和Firefox中,URL长度大约只能支持2000个字符左右。对于普通需求可能已足够,但如果需要传递大量数据,这显然不够用。与我们即将提出的解决方案相比,它的优势可能仅在于能够跨任意域名进行异步请求,而我们的解决方案只能突破子域名的限制。
让我们先构建一个静态页面,作为嵌入iframe中的代理。这个页面名为SubDomainProxy.html,其代码设计如下:
```html
document.domain = "test.";
function sendRequest(method, url) {
var request = new XMLHttpRequest();
request.open(method, url);
request.send(null);
}