Ajax的應(yīng)用中,由于安全的問(wèn)題,瀏覽器默認(rèn)是不支持跨域調(diào)用的。傳統(tǒng)解決的方法,包括:(參考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)
- Local proxy:
- Needs infrastructure (can't run a serverless client) and you
get double-taxed on bandwidth and latency (remote - proxy - client).
- Flash:
- Remote host needs to deploy a crossdomain.xml file, Flash is
relatively proprietary and opaque to use, requires learning a one-off
moving target programming langage.
- Script tag:
- Difficult to know when the content is available, no standard methodology, can be considered a "security risk".
以上方法都各有缺陷,都不是很好多解決方案。后來(lái)出現(xiàn)了一種叫JSON with Padding 的技術(shù),簡(jiǎn)稱 JSONP
.(原理參考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),應(yīng)
用JSONP可以實(shí)現(xiàn)JSON數(shù)據(jù)的跨域調(diào)用。非常的幸運(yùn),JQuery1.2以后支持JSONP的應(yīng)用。下面?zhèn)戎卣f(shuō)明在JQuery中,Json的跨域
調(diào)用。
????? 應(yīng)用JSONP實(shí)現(xiàn)Json數(shù)據(jù)跨域調(diào)用,需要服務(wù)器端與客戶端的合作完成。引用Jquery官方的例子,客戶端掉用如下:
$.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;
});
});
?
???
注意這里調(diào)用的地址中jsoncallback=?是關(guān)鍵的所在!其中,符號(hào)會(huì)被Query自動(dòng)替換成其他的回調(diào)方法的名稱,具體過(guò)程和原理我們這里不理
會(huì)。我們關(guān)心的是jsoncallback=?起什么作用了?原來(lái)jsoncallback=?被替換后,會(huì)把方法名稱傳給服務(wù)器。我們?cè)诜?wù)器端要做什
么工作呢?服務(wù)器要接受參數(shù)jsoncallback,然后把jsoncallback的值作為JSON數(shù)據(jù)方法名稱返回,比如服務(wù)器是JSP,我們會(huì)這
樣做:
?
????? ...
????? String jsoncallback=request.getParameter("jsoncallback");
????? ...
????? out.print(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");
?
Jquery取得的數(shù)據(jù)可能如下:
????? JQUET0988788({"account":"XX","passed":"true","error":"null"})
?
總結(jié),用JSONP要做兩件事:
????? 1/請(qǐng)求地址加參數(shù):jsoncallback=?
????? 2/服務(wù)器段把jsoncallback的值作為方法名傳回來(lái),如JQUET098788(...)
參考:
http://www.javaeye.com/topic/169765
http://www.javaeye.com/topic/260647