CORS正好可以解決這個問題。
CORS與JSONP相比,無疑更為先進、方便和可靠。
1、 JSONP只能實現GET請求,而CORS支援所有類型的HTTP請求。
舉個例子,假如需要從伺服器(http://www.a.com/user?id=123)擷取的資料如下:
{"id": 123, "name" : 張三, "age": 17}
那麼,使用JSONP方式請求(http://www.a.com/user?id=123?callback=foo)的資料將會是如下:
foo({"id": 123, "name" : 張三, "age": 17});當然,如果服務端考慮得更加充分,返回的資料可能如下:
try{foo({"id": 123, "name" : 張三, "age": 17});}catch(e){}
這時候我們只要定義一個foo()函數,並動態地建立一個script標籤,使其的src屬性為http://www.a.com/user?id=123?callback=foo:
<script type="text/javascript" src="http://www.a.com/user?id=123?callback=foo"></script>
便可以使用foo函數來調用返回的資料了。
在jQuery中如何通過JSONP來跨域擷取資料
第一種方法是在ajax函數中設定dataType為'jsonp':
$.ajax({ 2.dataType: 'jsonp', 3.url: 'http://www.a.com/user?id=123', 4.success: function(data){ 5.//處理data資料 6.} 7.});第二種方法是利用getJSON來實現,只要在地址中加上callback=?參數即可:
$.getJSON('http://www.a.com/user?id=123&callback=?', function(data){ 2.//處理data資料 3.});也可以簡單地使用getScript方法:
//此時也可以在函數外定義foo方法
function foo(data){
/處理data資料 }
$.getScript('http://www.a.com/user?id=123&callback=foo');
2、 使用CORS,開發人員可以使用普通的XMLHttpRequest發起請求和獲得資料,比起JSONP有更好的錯誤處理。
3、 JSONP主要被老的瀏覽器支援,它們往往不支援CORS,而絕大多數現代瀏覽器都已經支援了CORS。
PHP中: header(”"Access-Control-Allow-Origin: *”");
html中: <meta http-equiv=”Access-Control-Allow-Origin” content=”*”>
如果CORS中包含了302跳轉,則需要302跳轉之後的網址也包含CORS的header請求。
目前IE8以上和其他主流瀏覽器都已經支援了CORS跨域,相信這個技術未來會非常實用。