【问题标题】:So, JSONP or CORS? [closed]那么,JSONP 还是 CORS? [关闭]
【发布时间】:2012-08-31 02:04:09
【问题描述】:

我的 WebAPI 部署在 Intranet 环境中。这意味着安全不是我关心的问题。

似乎 CORS 对客户端更加友好并且更容易实现

还有其他我可能遗漏的问题吗?

【问题讨论】:

    标签: jsonp cors asp.net-web-api


    【解决方案1】:

    根据 Spring 文档,JSONP 是一种 hack,而不是跨域资源共享的正确解决方案。因此,如果您不关心安全性,那么只需检查您服务器上的域来源并添加 Access-Control-Allow-Origin 响应标头。

    【讨论】:

      【解决方案2】:

      我们的 Web API 无法在带有 Windows 身份验证的 Safari (iOS 9.1) 上运行。它适用于 Safari + iOS 8.4。当我们更改为 JSONP 时,Safari 又开始工作了。更多信息请查看this link

      【讨论】:

      【解决方案3】:

      这是一个相当广泛的问题,并且可以保证一个 wiki 本身。 google 上也有很多关于这两者的信息,但我认为我可以达到几个关键点。

      • 如果您的服务器需要只读 ajax 接口,并且需要支持 IE
      • 另一方面,如果您的 Web API 是读/写的(例如完整的 REST 或只是 POST/GET)而不是只读的(即 GET),则 JSONP 不可用。使用 CORS。 JSONP 本质上是只读的。

      如果这些都不是问题,我会选择最简单或最熟悉的方法。如果它是一个折腾,请尝试 CORS,因为它是更“现代”的解决方案,而 JSONP 更像是一种 hack,将数据转换为脚本以绕过跨域限制。然而,CORS 通常需要更多的服务器端配置。

      如果您使用的是 jQuery,我不确定您从哪里想到 CORS“对客户端更友好并且更容易实现强>。”见https://gist.github.com/3131951。 jQuery 抽象了 JsonP 的细节,根据您使用的技术,在服务器端实现 CORS 实际上可能有些棘手。

      我最近开发了一个 web 应用程序,使用 jquery 和backbone.js,它从我们控制的各种跨域 web 服务中读取,最终使用 Json-P 而不是 CORS,因为我们需要支持 IE7,它是一个在服务器端稍微简单一点(我们运行带有 DjangoRestFramework 的 Django),在客户端与 jquery 几乎相同。

      【讨论】:

      • 如果您支持 IE8 和 IE9,它也可以排除 CORS,因为 Content-Type 被强制为“text/plain”,请参阅blogs.msdn.com/b/ieinternals/archive/2010/05/13/…的第 (4) 点
      • 您回答的要点非常有帮助,谢谢!
      • 我的理解是 JSONP 你必须在客户端处理,CORS 你必须在服务器端处理。对吗?
      • 我只想补充一点,即使 jsonp 也可以通过 GET 调用,您可以编写后端代码来执行写入。您可以在查询字符串上传递参数,因此您可以使用 GET 和查询字符串参数模拟 post、put、patch。 (当然不是理想的)
      【解决方案4】:

      最后但同样重要的是,如果您使用的是 jQuery v1.x,请考虑仍然不调用 errorcomplete(或更好的 failalways)处理程序用于一些常见情况下的 JSONP 请求(例如网络错误)。当然有解决方法(超时设置,jQuery-JSONP 插件),但我发现 CORS 不那么烦人,特别是当跨域请求仅来自移动设备(即混合应用程序)时,因此您不需要支持不幸的浏览器。

      【讨论】:

      • +1 获取回调信息
      【解决方案5】:

      你很准。如果您不必支持旧版浏览器(6 年前发布的浏览器),我肯定会选择 CORS。

      CORS 更容易实现,因为如果您的 API 尚不支持 JSONP 或 CORS,则添加一些静态标头比修改响应正文更容易。

      此外,使用 CORS 缓存请求更容易。每个 JSONP 请求都需要是动态的,即使是 memcached 内容。

      JSONP 仍然是一个脚本标签,所以不管它是什么都会引起某种程度的同步行为。 CORS 不会。

      JSONP 只能是 GET。与 CORS 一样,您可以使用任何方法。

      【讨论】:

      • 我很欣赏“同步行为”信息。
      • 我相信您可以以异步方式下载脚本。 JQuery 在它的 ajax 请求上提供了这个参数。我不确定它是否适用于 jsonp。 api.jquery.com/jquery.ajax
      猜你喜欢
      • 2015-06-15
      • 2014-01-16
      • 1970-01-01
      • 2016-09-03
      • 2018-09-13
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多