2010-11-30 105 views
3

我想创建我自己的XMLHttpRequest框架,以了解这些东西在内部是​​如何工作的。 令我感到困惑的是我无法找到如何捕捉“同源”异常。在Javascript中捕获同源异常?

这个想法背后是我尝试加载一个URL,如果我得到一个相同的起源异常,我通过脚本的本地代理脚本重新请求URL。我这样做的原因是因为我需要从开发沙箱访问生产数据,我希望它对脚本本身尽可能透明。

我知道这是一个不好的做法,但是这是目前:)

只是为了澄清事情这样做的侵入性最小的方式 - 我不希望绕过相同的起源,我只是想赶上抛出的异常,所以我可以做一些事情。

这是我目前使用我XHR代码:

var net = function (url, cb, setts){ 
    this.url = url; 
    this.cb = cb; 

    var oThis = this; 
    if (!this.xhr) { 
     this.xhr = new XMLHttpRequest(); 
     this.xhr.onreadystatechange = function() { 
      if (oThis.xhr.readyState == 4 && oThis.xhr.status == 200) { 
       document.body.innerHTML += "RS: "+oThis.xhr.readyState+"; ST:"+oThis.xhr.status+"; RP:"+oThis.xhr.responseText+"<br>"; 
      } 
      else { 
       // do some other stuff :) 
       document.body.innerHTML += "RS: "+oThis.xhr.readyState+"; ST:"+oThis.xhr.status+"; RP:"+oThis.xhr.responseText+"<br>"; 
      } 
     } 
    } 
    this.xhr.open("GET", url,true); 
    this.xhr.send(); 
} // It's WIP so don't be scared about the unused vars or hardcoded values :) 

我试图尝试...赶上周围xhr.send();但无济于事,依然无法抓住例外。

任何想法或指针将不胜感激。

回答

1
xhr.onreadystatechange = function() { 
    if (xhr.readyState==4) { 
     if (xhr.status==0) { 
      alert("denied"); 
     } else { 
      alert("allowed"); 
     } 
    } 
} 
1

你确定它实际上应该抛出异常吗?我看不到任何规格: http://www.w3.org/TR/XMLHttpRequest/#exceptions 看起来像它。我的错。

在这两种情况下,都可以根据用户当前所在页面的域来检查传入字符串的域。


FWIW,你可以通过this jsFiddle看到(打开Web检查),Chrome并没有真正抛出异常。它只是说“无法加载资源”。

+1

第3.6.1节“如果url的原点与XMLHttpRequest原点不匹配,则会引发SECURITY_ERR异常。 – Emmett 2010-11-30 21:30:14

+0

Bah,我是盲人。 没关系。 – aditya 2010-11-30 21:32:48