【问题标题】:Problems executing an XMLHttpRequest from file:// to http://从 file:// 到 http:// 执行 XMLHttpRequest 时出现问题
【发布时间】:2011-04-10 00:26:23
【问题描述】:

我正在尝试使用 JQuery.ajax 从本地文件 (file://) 到 http:// 上的某些内容执行 XMLHttpRequest,从我可以看到它看起来请求正在发出(成功回调被调用并且 Firebug 显示请求)但根本没有响应返回。

这基本上是我正在做的事情:

$.ajax({
    url: "https://stackoverflow.com/users/63736/bruce-van-der-kooij",
    dataType: "text",
    success: function(text) {
        alert(text)
    }
})

注意我使用的是datatype: "text",但你使用什么并不重要。

这将显示一个空警报。

现在,如果我不得不猜测,我不得不说这与同源策略有关,但我没有得到典型的 NS_ERROR_DOM_SECURITY_ERR 异常(错误控制台中什么都没有)。

那么有人对发生的事情有解释吗?

相关

更新:

所以我遇到了一个July 2009 article at hacks.mozilla.org,它似乎可以解释发生了什么。显然 Firefox >= 3.5 实现了Cross-Origin Resource Sharing (CORS) specification,它提供了一种机制来允许您进行跨站点请求。文章中解释了这种情况下发生的情况:

在 Firefox 3.5 和 Safari 4 中,如果服务器没有将适当的 CORS 标头(特别是 Access-Control-Allow-Origin 标头)与资源一起返回,则跨站点 XMLHttpRequest 将无法成功获取资源,尽管请求将通过。

请注意,在我的情况下,请求发送时带有标头Origin: null,并返回200 OK 响应。但是,服务器没有发回适当的标头,因此没有检索到响应正文。

另见:

【问题讨论】:

标签: javascript jquery xmlhttprequest


【解决方案1】:

(回答我自己的问题)

请求发出的原因是因为 Firefox >= 3.5 实现了Cross-Origin Resource Sharing (CORS) specification,它提供了一种机制来允许您发出跨站点 HTTP 请求。默认情况下,这些请求不会发送任何凭据(HTTP Cookie 和 HTTP 身份验证信息)。

但是,如果服务器没有随资源一起提供适当的 CORS 标头(特别是 Access-Control-Allow-Origin),则跨站点 HTTP 请求将无法成功获取资源。响应将被浏览器简单地忽略。

这是一个成功的跨站点请求示例(它会检索我的 YouTube 个人资料):

$.ajax({
    url: "http://gdata.youtube.com/feeds/api/users/brucevdk?v=2&alt=json",
    dataType: "json",
    success: function(response) {
        alert(response)
    }
})

如果您查看响应标头,您会看到:

Access-Control-Allow-Origin: *

这意味着“允许来自任何来源的请求”。

资源

【讨论】:

    【解决方案2】:

    补充说明:

    * Due to browser security restrictions, most "Ajax" requests are
    

    遵守同源政策;这 请求无法成功检索 来自不同域的数据, 子域或协议。

    来自you've mentioned 页面。 jQuery ajax 请求不支持开箱即用的跨域请求。 Google 搜索可以提供一些解决方法...

    【讨论】:

    • 请注意,我在我的问题中提到了相同的来源策略,但是您如何解释它为什么不抛出 NS_ERROR_DOM_SECURITY_ERR 异常?我怀疑为什么(我会在一秒钟内更新我的答案)。
    • 我的错。我没有完全阅读你的问题。您在这个问题上给出的更新似乎确实是有道理的。因此,任何其他浏览器(不实现 CORS)都可能会给出 NS_ERROR_DOM_SECURITY_ERR。
    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多