Ajax的應用中,因爲安全的問題,瀏覽器默認是不支持跨域調用的。傳統解決的方法,包括:(參考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)python
以上方法都各有缺陷,都不是很好多解決方案。後來出現了一種叫JSON with Padding 的技術,簡稱 JSONP .(原理參考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),應用JSONP能夠實現JSON數據的跨域調用。很是的幸運,JQuery1.2之後支持JSONP的應用。下面側重說明在JQuery中,Json的跨域調用。json
應用JSONP實現Json數據跨域調用,須要服務器端與客戶端的合做完成。引用Jquery官方的例子,客戶端掉用以下:api
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data){ $.each(data.items, function(i,item){ $("<img/>").attr("src", item.media.m).appendTo("#images"); if ( i == 3 ) return false; }); });
注意這裏調用的地址中jsoncallback=?是關鍵的所在!其中,符號會被Query自動替換成其餘的回調方法的名稱,具體過程和原理咱們這裏不理 會。咱們關心的是jsoncallback=?起什麼做用了?原來jsoncallback=?被替換後,會把方法名稱傳給服務器。咱們在服務器端要作什麼工做呢?服務器要接受參數jsoncallback,而後把jsoncallback的值做爲JSON數據方法名稱返回,好比服務器是JSP,咱們會這樣作:跨域
String jsoncallback=request.getParameter("jsoncallback");瀏覽器
...安全
out.print(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");服務器
Jquery取得的數據可能以下:app
JQUET0988788({"account":"XX","passed":"true","error":"null"})less
總結,用JSONP要作兩件事:dom
一、請求地址加參數:jsoncallback=?
二、服務器段把jsoncallback的值做爲方法名傳回來,如JQUET098788(...)