jQuery - Ajax解決跨域問題

Ajax的應用中,因爲安全的問題,瀏覽器默認是不支持跨域調用的。傳統解決的方法,包括:(參考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)python

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".

以上方法都各有缺陷,都不是很好多解決方案。後來出現了一種叫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(...)

相關文章
相關標籤/搜索