2012-09-06 34 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標題。

相關問題