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

          ajax跨域調用及jsonp

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

          Ajax的應用中,由于安全的問題,瀏覽器默認是不支持跨域調用的。傳統(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 的技術,簡稱 JSONP .(原理參考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),應 用JSONP可以實現(xiàn)JSON數(shù)據(jù)的跨域調用。非常的幸運,JQuery1.2以后支持JSONP的應用。下面?zhèn)戎卣f明在JQuery中,Json的跨域 調用。

          ????? 應用JSONP實現(xiàn)Json數(shù)據(jù)跨域調用,需要服務器端與客戶端的合作完成。引用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;
          });
          });

          ?

          ??? 注意這里調用的地址中jsoncallback=?是關鍵的所在!其中,符號會被Query自動替換成其他的回調方法的名稱,具體過程和原理我們這里不理 會。我們關心的是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"})

          ?

          總結,用JSONP要做兩件事:

          ????? 1/請求地址加參數(shù):jsoncallback=?

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

          參考:

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

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

          主站蜘蛛池模板: 鹤庆县| 秭归县| 筠连县| 肇庆市| 库尔勒市| 安塞县| 英超| 额尔古纳市| 灵宝市| 抚远县| 高碑店市| 突泉县| 青龙| 三明市| 专栏| 天台县| 香港 | 中宁县| 交城县| 府谷县| 衡阳市| 英吉沙县| 浦东新区| 谢通门县| 富裕县| 平度市| 酒泉市| 西青区| 蓬莱市| 泰州市| 双鸭山市| 合江县| 清涧县| 桑植县| 南靖县| 桦南县| 五指山市| 台山市| 海安县| 平南县| 宁安市|