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 閱讀(2340) 評論(0)  編輯  收藏 所屬分類: web開發(fā)jquery(進去而已)

          Ajax的應用中,由于安全的問題,瀏覽器默認是不支持跨域調(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/),應 用JSONP可以實現(xiàn)JSON數(shù)據(jù)的跨域調(diào)用。非常的幸運,JQuery1.2以后支持JSONP的應用。下面?zhèn)戎卣f明在JQuery中,Json的跨域 調(diào)用。

          ????? 應用JSONP實現(xiàn)Json數(shù)據(jù)跨域調(diào)用,需要服務器端與客戶端的合作完成。引用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)鍵的所在!其中,符號會被Query自動替換成其他的回調(diào)方法的名稱,具體過程和原理我們這里不理 會。我們關(guān)心的是jsoncallback=?起什么作用了?原來jsoncallback=?被替換后,會把方法名稱傳給服務器。我們在服務器端要做什 么工作呢?服務器要接受參數(shù)jsoncallback,然后把jsoncallback的值作為JSON數(shù)據(jù)方法名稱返回,比如服務器是JSP,我們會這 樣做:

          ?

          ????? ...

          ????? 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/服務器段把jsoncallback的值作為方法名傳回來,如JQUET098788(...)

          參考:

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

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

          主站蜘蛛池模板: 龙海市| 政和县| 永福县| 鹤庆县| 昌江| 徐水县| 临安市| 武乡县| 两当县| 灌阳县| 肃宁县| 平乡县| 兴化市| 绥芬河市| 太康县| 监利县| 舞钢市| 垦利县| 海阳市| 辽宁省| 凉城县| 长海县| 青海省| 北海市| 逊克县| 拉萨市| 鄱阳县| 巴林左旗| 和顺县| 伊通| 广昌县| 台南市| 遂平县| 湟中县| 蕲春县| 麟游县| 左权县| 广安市| 伊宁县| 射阳县| 钟山县|