【问题标题】:Is it possible to distinguish network errors from cross-origin errors?是否可以区分网络错误和跨域错误?
【发布时间】:2010-05-18 21:27:20
【问题描述】:

http://www.w3.org/TR/access-control/

阅读上面链接的 CORS 规范,似乎无法可靠地区分一般的“网络错误”和跨域访问被拒绝错误。来自规范:

如果出现网络错误应用网络错误步骤。

执行资源共享检查。如果返回失败,请应用网络错误步骤。

http://www.w3.org/TR/access-control/#simple-cross-origin-request0

在我的测试中,我找不到任何似乎表明资源共享检查肯定失败的 Firefox 实现功能。它只是将 readyState 切换为 4 并将状态设置为 0。

最终,我希望能够将成功回调、一般失败回调和可选的跨域失败回调传递给我的函数。感谢您提供任何帮助或见解。

【问题讨论】:

    标签: javascript xmlhttprequest


    【解决方案1】:

    您可能不需要发出 XHR 请求就知道何时会发生跨域错误。根据 jQuery 的 $.get 尝试以下操作:

    var xhr = {
        get: function(url, data, callback, dataType) {
            if ( !this.isSameOrigin(url) ) {
                callback(null, "Same-origin error or whatever", null);
            }
    
            $.get(url, data, callback, dataType);
        },
    
        isSameOrigin: function(url) {
            // Do a string comparison against window.location.  Get as complicated 
            // as you'd like
            return !!(
                // Url doesn't contain a valid protocol (relative to domain))
                !url.match(/^https?:\/\//i) || 
                // Url contains a protocol but the request is to the current domain
                url.match(new RegExp("^https?://" + window.location.host, "i"))
            );
        }
    };
    

    【讨论】:

    • 我说的是跨域资源共享,不是传统的ajax。在这种情况下,您必须发出请求,因为在客户端确定是否存在跨域故障之前需要响应标头。
    • 您将其标记为 xhr 和 xmlhttprequest,它们都是 AJAX。否则,您如何检索资源?无论如何,由于它是一种标准的浏览器安全措施,您不必发出 AJAX 请求会因为同源策略而失败。唯一的例外是当您不知道您是否正在执行 JSONP 请求时,您应该这样做。
    • 最新版本的 XHR 允许同源策略例外。但是为了有一个例外,需要有一定的响应头。请参阅我的 OP 顶部的链接。
    猜你喜欢
    • 2020-08-27
    • 2023-03-13
    • 1970-01-01
    • 2018-04-05
    • 2016-11-17
    • 2011-02-22
    • 1970-01-01
    • 2015-02-18
    • 2018-01-03
    相关资源
    最近更新 更多