MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          ajax跨域調(diào)用及jsonp

          Posted on 2009-07-19 01:48 leekiang 閱讀(2339) 評論(0)  編輯  收藏 所屬分類: web開發(fā) 、jquery(進(jìn)去而已)

          Ajax的應(yīng)用中,由于安全的問題,瀏覽器默認(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".

          以上方法都各有缺陷,都不是很好多解決方案。后來出現(xiàn)了一種叫JSON with Padding 的技術(shù),簡稱 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明在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)鍵的所在!其中,符號會(huì)被Query自動(dòng)替換成其他的回調(diào)方法的名稱,具體過程和原理我們這里不理 會(huì)。我們關(guān)心的是jsoncallback=?起什么作用了?原來jsoncallback=?被替換后,會(huì)把方法名稱傳給服務(wù)器。我們在服務(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/請求地址加參數(shù):jsoncallback=?

          ????? 2/服務(wù)器段把jsoncallback的值作為方法名傳回來,如JQUET098788(...)

          參考:

          http://www.javaeye.com/topic/169765

          http://www.javaeye.com/topic/260647

          主站蜘蛛池模板: 西畴县| 安宁市| 奉化市| 上蔡县| 辉南县| 青铜峡市| 夹江县| 蒙阴县| 平泉县| 永州市| 辉南县| 阿鲁科尔沁旗| 宜昌市| 惠水县| 佛教| 彰化市| 景洪市| 东莞市| 新野县| 永定县| 旌德县| 客服| 遵义市| 六安市| 和林格尔县| 兴国县| 嘉黎县| 吉林省| 凤山市| 南阳市| 任丘市| 孟津县| 南部县| 平利县| 玉山县| 长葛市| 济源市| 广东省| 无棣县| 老河口市| 宣威市|