那么,JSONP还是CORS?[关闭]


111

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

似乎CORS 对客户更友好更易于实现

还有其他我可能错过的问题吗?

Answers:


144

这是一个相当广泛的问题,可能需要一个维基。谷歌在这两个方面也有很多,但我想我可以提出几点要点。

  • 如果您需要服务器的只读ajax接口,并且需要支持IE <= 9,Opera <12或Firefox <3.5或其他各种较旧的或晦涩的浏览器,那么CORS不在了,请使用JSONP。IE8和IE9排序支持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和bone.js读取了我们控制的各种跨域Web服务,最终使用了Json-P而不是CORS,因为我们需要支持IE7,并且在IE7上要简单一些服务器端(我们运行带有DjangoRestFramework的Django),并且与客户端上的jquery几乎相同。


3
如果您支持IE8和IE9,由于Content-Type被强制为“文本/纯文本”,它也可以排除CORS,请参阅blogs.msdn.com/b/ieinternals/archive/2010/05的第
jamiebarrow14年

您的回答的要点非常有帮助,谢谢!
MVCDS 2015年

我了解的是必须在客户端处理的JSONP和必须在服务器端处理的CORS。正确?
2015年

我只想补充一点,即使jsonp可以通过GET调用,您也可以对后端进行编码以执行写入操作。您可以在querystring上传递参数,以便可以模拟带有GET和quesystring参数的发布,放置,修补。(当然不是理想的选择)
Gabriel Carignano

45

你很漂亮。如果您不必支持旧版浏览器(6年前发布的版本),那么我肯定会使用CORS。

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

同样,使用CORS缓存请求也更容易。每个JSONP请求都必须是动态的,即使具有内存缓存内容也是如此。

JSONP仍然是一个脚本标记,因此无论它会导致某种程度的同步行为。CORS不会。

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


3
我感谢“同步行为”信息。
Juan Lanus 2013年

我相信您可以异步方式下载脚本。jQuery在其ajax请求上提供此参数。我不确定它是否适用于jsonp。 api.jquery.com/jquery.ajax
eran otzap

11

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


1
+1有关回调的信息
plainjimbo 2014年

1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.