在 Javascript 中捕获同源异常?

Posted

技术标签:

【中文标题】在 Javascript 中捕获同源异常?【英文标题】:Catching same origin exception in Javascript? 【发布时间】:2011-05-18 03:32:44 【问题描述】:

我正在尝试创建自己的 XMLHttpRequest 框架来了解这些东西是如何在内部工作的。 令我困惑的是,我找不到如何捕获“同源”异常。

这背后的想法是我尝试加载一个 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");
        
    

【讨论】:

我也是这样走的。虽然在 Chrome 中如果你想在这之后重用 XHR,你必须重新创建它,因为它不会响应之后的任何请求。【参考方案2】:

你确定它真的应该抛出异常吗?我在规范中看不到任何内容:http://www.w3.org/TR/XMLHttpRequest/#exceptions 看起来确实如此。我的错。

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


FWIW,正如您在this jsFiddle(打开 Web Inspector)所看到的,Chrome 并没有真正抛出异常。它只是说“加载资源失败”。

【讨论】:

第 3.6.1 节:“如果 url 的来源与 XMLHttpRequest 的来源不匹配,则引发 SECURITY_ERR 异常。”

以上是关于在 Javascript 中捕获同源异常?的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中获取未捕获的异常

是否可以捕获 JavaScript 异步回调中抛出的异常?

JavaScript的事件及异常捕获

javascript 捕获了节点中的所有启动异常

JAVA中try catch捕获异常的问题

是否有可能捕获JavaScript异步回调中抛出的异常?