2012-09-06 21 views
101

我的WebAPI部署在Intranet环境中。这意味着安全不是我关心的。那么,JSONP还是CORS?

看来CORS是更友好给客户端和更容易实现

我可能错过了任何其他问题?

回答

130

这是一个相当宽泛的问题,可以保证维基本身。谷歌在这两方面也有相当一部分,但我想我可以打出几个关键点。

  • 如果你需要一个只读的Ajax界面到您的服务器,你需要支持IE < = 9,歌剧< 12,或Firefox < 3.5或其他各种旧的或隐晦的浏览器,CORS出来了,用JSONP 。 IE8和IE9 sorta支持CORS但有问题,请参阅下面第一条评论中的链接。另一方面,如果您的Web API是可读/写的(例如,完全REST或只是POST/GET)而不是只读(即GET),那么JSONP就不存在了。使用CORS。 JSONP本质上是只读的。

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

如果你使用jQuery,我不知道你在哪里想出的想法,CORS是“更加友好客户端和更容易实现。”见https://gist.github.com/3131951。 jQuery对JsonP的细节进行了抽象,而CORS实际上可能在你的服务器端实现有点棘手,这取决于你使用的是什么技术。

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

+2

如果您支持IE8和IE9,它也可以排除CORS,因为Content-Type被强制为“text/plain”,请参阅http://blogs.msdn.com/b/上的第(4)点。 ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitation-and-workarounds.aspx – jamiebarrow

+0

有道理的伙伴 –

+0

答案中的要点非常有帮助,谢谢! – MVCDS

40

你很漂亮。如果您不需要支持传统浏览器(6年前发布的浏览器),我一定会使用CORS。

CORS更容易实现,因为如果你的API不支持JSONP或CORS,只需添加一些静态头文件比修改响应体更容易。

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

JSONP仍然是一个脚本标记,所以不管它会引起什么级别的同步行为。 CORS不会。

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

+3

我赞赏“同步行为”信息。 –

10

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

+1

+1回调信息 – plainjimbo

-1

我们的Web API在Windows身份验证的Safari(iOS 9.1)上不起作用。它正在与Safari + iOS 8.4一起工作。当我们改为JSONP Safari时,又开始工作了。请查询this link了解更多信息。

+0

这也是一篇好文章 - https://blog.algolia.com/jsonp-still-mandatory/ – Anoop

1

根据Spring Documentation,JSONP是一种黑客攻击,而非跨源资源共享的适当解决方案。因此,如果安全不是您的担忧,那么只需在您的服务器上检查您的域名来源并添加Access-Control-Allow-Origin Response标题。

相关问题