112

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

似乎 CORS对客户端更友好,更容易实现

我可能遗漏的任何其他问题?

4

5 回答 5

146

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

  • 如果您的服务器需要只读 ajax 接口,并且需要支持 IE<=9、Opera<12 或 Firefox<3.5 或各种其他较旧或不知名的浏览器,CORS 已淘汰,请使用 JSONP。IE8 和 IE9 sorta 支持 CORS 但有问题,请参阅下面第一条评论中的链接。
  • 另一方面,如果您的 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 几乎相同。

于 2012-09-06T23:02:02.747 回答
45

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

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

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

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

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

于 2013-03-15T18:33:48.357 回答
11

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

于 2013-08-25T18:05:42.890 回答
1

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

于 2016-03-03T20:05:44.480 回答
-1

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

于 2015-11-19T21:26:04.410 回答