成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用JSONP解決跨域數據訪問問題

開發 前端
本文將介紹如何使用Jsonp解決跨域數據訪問問題,解決這個限制的一個相對簡單的辦法就是在服務器端發送請求,服務器充當一個到達第三方資源的代理中繼。

簡介

符合Web2.0特征的眾多網站一個明顯的特點就是采用Ajax。Ajax提供了在后臺提交請求訪問數據的功能。其實現主要使用的是XMLHttpRequest函數,這個函數允許客戶端的Javascript

發送到服務器端的HTTP請求并獲得返回數據。Ajax同時也是目前眾多的Mashup背后的驅動力量,他們都利用Ajax來聚合不同來源的信息。

理解同源策略的限制

同源策略是指阻止代碼獲得或者更改從另一個域名下獲得的文件或者信息。也就是說我們的請求地址必須和當前網站的地指相同。同源策略通過隔離來實現對資源的保護。這個策略的歷史非常悠久
從Netscape Navigator 2.0時代就開始了。

解決這個限制的一個相對簡單的辦法就是在服務器端發送請求,服務器充當一個到達第三方資源的代理中繼。雖然是用廣泛但是這個方法卻不夠靈活。

另一個辦法就是使用框架(frames),將第三方站點的資源包含進來,但是包含進來的資源同樣要受到同源策略的限制。

有一個很巧妙的辦法就是在頁面中使用動態代碼元素,代碼的源指向服務地址并在自己的代碼中加載數據。當這些代碼加載執行的時候,同源策略就不會起到限制。但是如果代碼試圖下載文件的時候
執行還是會失敗,幸運的是,我們可以使用JSON(JavaScript Object Notation)來改進這個應用。

JSON和JSONP

與XML相比,JSON是一個輕量級的數據交換格式。JSON對于JavaScript開發人員充滿魅力的原因在于JSON本身就是Javascript中的對象。

例如一個ticker對象
    var ticker = {symbol:'IBM',price:100}

而JSON串就是    {symbol:'IBM',price:100}

這樣我們就可以在函數的參數中傳遞JSON數據。我們很容易掌握在函數中使用動態的JSON參數數據,但是我們的目的并不是這個。

通過使我們的函數能夠加載動態的JSON數據,我們就能夠處理動態的數據,這項技術叫做 Dynamic Javascript Insertion。

我們看下面的例子
index.html中

ticker.js中
    var data = {symbol:'IBM', price:100};
    showPrice(data);

上面的代碼通過動態加入Javascript代碼,來執行函數加載數據。
正如之前提到過的,同源策略對于動態插入的代碼不適用。也就是你可以從不同的域中加載代碼,來執行在他們代碼中的JSON數據。

這就是JSONP(JSON with Padding)。注意,使用這種方法時,你必須在頁面中定義回調函數,就像上例中的showPrice一樣。

我們通常所說的JSONP服務(遠程JSON服務),實際上就是一種擴展的支持在用戶定義函數中包含返回數據的能力。這種方法依賴于必須接受一個回調函數的名字作為參數。

然后執行這個函數,處理JSON數據,并顯示在客戶頁面上。

JQuery的JSONP支持

從JQery 1.2以后,就開始支持JSONP的調用。在另外的一個域名中指定好回調函數名稱,你就可以用下面的形式來就加載JSON數據。

    url?callback=?

示例:
    jQuery.getJSON(url + "&callbak=?", function(data){
        alert("Symbol:" + data.symbol + ", Price:" + data.price);
    });

jquery會在window對象中加載一個全局的函數,當代碼插入時函數執行,執行完畢后就會被移除。同時jquery還對非跨域的請求進行了優化,如果這個請求是在同一個域名下那么他就會像正常的Ajax請求一樣工作。

上例中我們在動態插入到頁面的代碼中使用了靜態的json數據,雖然完成了依次JSONP返回,但仍不是JSONP服務,因為不支持在URL中定義回調函數名稱。下面是一個將其變成JSONP服務的一個方法
服務器端使用PHP。

首先我們來定義接口的規范,就像這樣:http://www.mydomain.com/jsonp/ticker?symbol=IBM&callback=showPrice
symbol是請求條件,callback是回調函數名稱。

在頁面文件中,我們使用JQuery的支持:

        //JQuery JSONP Support
        var url = "http://www.mydomain.com/api/suggest.php?symbol=IBM&callback=?";
        jQuery.getJSON(url, function(data){
            alert("Symbol:" + data.symbol + ", Price:" + data.price);
        });

在suggest.php中
     $jsondata = "{symbol:'IBM', price:120}";
     echo $_GET['callback'].'('.$jsondata.')';

現在,如果我們想制作一些mashup,或者將第三方的資源整合到一個頁面中,我們就很容易想到JSONP的解決方法了。

現有的JSONP服務

既然我們已經知道如何使用JSONP,那么我們也就可以使用一些現有的JSONP服務了,下面是一些例子:

    Digg API:http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javascript&callback=?
    Geonames API:http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?
    Flickr API:http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?

注意:

JSONP是一個非常強大的構建mashp的方法,可是不是一個解決跨域訪問問題的萬能藥。它也有一些缺點

第一也是最重要的:JSONP不提供錯誤處理。如果動態插入的代碼正常運行,你可以得到返回,但是如果失敗了,那么什么都不會發生。你無法獲得一個404的錯誤,也不能取消這個請求。另外一個重要的缺點是如果使用了不信任的服務會造成很大的安全隱患。

責任編輯:彭凡 來源: cnblogs
相關推薦

2009-12-22 11:21:43

WCF跨域訪問

2012-03-27 15:23:15

JSONPAJAX

2024-08-02 08:21:52

Spring項目方式

2010-02-24 10:55:01

WCF跨域訪問

2010-07-30 12:40:00

Flex跨域訪問

2012-09-25 09:28:57

程序員

2017-08-20 12:49:59

瀏覽器跨域服務器

2021-06-25 09:04:39

Cors跨域JSONP vs CO

2024-10-29 16:41:24

SpringBoot跨域Java

2021-06-06 13:05:15

前端跨域CORS

2019-11-11 17:34:16

前端開發技術

2019-10-30 15:08:09

大數據Hadoop數據中心

2024-05-20 09:28:44

Spring客戶端瀏覽器

2009-02-18 09:30:10

AJAX跨域XML

2011-05-26 13:10:30

JSONPJSON

2024-12-02 14:30:20

2024-02-27 08:14:51

Nginx跨域服務

2021-11-03 06:57:41

瀏覽器Jsonp安全

2021-07-08 07:01:53

瀏覽器安全前端

2022-03-11 10:01:47

開發跨域技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩精品一区 | 久久在线看 | 一区二区三区视频在线免费观看 | 国产羞羞视频在线观看 | 中国三级黄色录像 | 视频一区在线 | 国产精久久久 | 欧美日韩1区 | 久草免费在线视频 | 91九色视频在线 | 欧美精选一区二区 | 毛片一区二区三区 | 成人毛片在线视频 | 日韩视频一区 | 美女啪啪国产 | 青青青伊人 | 一区观看| 国产二区在线播放 | 精品国产精品三级精品av网址 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 国产日韩欧美一区二区在线播放 | 国产视频精品区 | 国产高清精品一区二区三区 | 国产精品久久久久久一区二区三区 | 在线国产精品一区 | 99re视频这里只有精品 | 久久久国产网站 | 亚洲 中文 欧美 日韩 在线观看 | av一区二区三区四区 | 久久最新网址 | 伊人免费观看视频 | 亚洲一区二区视频 | 亚洲最大成人综合 | 日韩在线播放网址 | 国产一区二区黑人欧美xxxx | 99精品久久久国产一区二区三 | 欧美一级二级三级 | 亚洲国产成人精品女人久久久野战 | 在线欧美一区 | 中文字幕国产第一页 | 成年视频在线观看福利资源 |