【问题标题】:localhost and cross domain request本地主机和跨域请求
【发布时间】:2014-11-26 16:57:54
【问题描述】:

我正在尝试了解 JSONP 以及何时使用它。我写了下面的代码并且能够从服务调用中取回数据,为什么它没有被阻止?当我在本地机器上运行它时,试图从另一台机器上请求数据,这不应该违反同源策略吗?我没有在下面使用 JSONP,所以我认为这会被阻止。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="Scripts/jquery-2.1.1.min.js"></script>
    <script type="text/javascript">
    $.ajax({
        url: 'https://api.github.com/users/robconery',
        type: 'GET',
        data: "",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            $("#name").text(data.login);
        }
    });
    </script>
</head>
<body>
    <span id="name"></span>
</body>
</html>

【问题讨论】:

    标签: jquery json jsonp


    【解决方案1】:

    JSONP 插入一个脚本标签,就像从网络上的任何地方包含一个脚本一样,例如

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    

    即使它位于 Google 的域中,您也不会发现任何问题。
    JSONP也是一样的东西,它插入了script标签,这样就绕过了同源策略。

    在文件内部,JSON 被包装在一个函数中,当脚本加载后,该函数被调用以返回 JSON 等。这就是 JSON 被包装在 javascript 函数中的原因。

    jQuery 巧妙地将 JSONP 封装到它的 ajax 功能中,因此无法立即看出发生了什么,但它根本不是真正的 ajax。

    作为旁注,您对 Github 的请求是 NOT JSONP,您已将数据类型设置为 json,因此它只是常规 JSON,但 Github 规避了同源策略通过使用Access-Control-Allow-Origin 标头和CORS

    【讨论】:

    • 我知道我没有发出 JSONP 请求,我故意使用 JSON,因为我认为 JSON 会被拒绝,因为我是从本地主机请求它。那么通过使用 Access-control-Allow-Origin,Github 允许它,否则 JSON 请求会被阻止吗?
    【解决方案2】:

    你在这里混淆了几件事。

    什么是 JSONP?

    JSONP 是一种不受同源策略影响的数据检索方式。那是因为 JSONP 只是动态包含 &lt;script&gt;,而 &lt;script&gt;s 不受 SOP 约束。

    什么是 SOP?

    Ajax 请求(即XMLHTTPRequest)。


    但是,您没有使用 JSONP!

    你永远不会告诉 jQuery 发出 JSONP 请求!那将是dataType: "jsonp",而不是dataType: "json"。后者只是告诉 jQuery 将来自 Ajax 请求的响应作为 JSON 处理。

    那么,为什么它仍然有效?

    服务器必须通过设置特定标头来禁用 SOP (CORS):

    Access-Control-Allow-Origin:*
    

    这正是 GitHub API 正在做的事情。

    【讨论】:

    • 这意味着如果我将数据类型留空 JSONP 请求将自动发出??
    • 不,一点也不。 jQuery 仅在您明确告诉它使用 JSONP 时才使用它。
    • "你永远不会告诉 jQuery 发出 JSONP 请求!"这是什么意思?
    • @FelixKling - 除非你使用$.getJSON,它会自动计算出来。
    • @adeneo:仅当您在 URL 中添加 callback=? 之类的内容时。
    【解决方案3】:

    这是可行的,因为 github API 包含 Access-Control-Allow-Origin:* 响应标头。

    【讨论】:

    • 你忘了说 OP 根本没有做 JSONP 请求。如果是 JSONP,它就可以工作,不需要那些标头。
    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 2018-09-17
    • 2011-04-20
    • 2017-09-15
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多