<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    美麗涵涵童裝店--說我博客名字,給你們打折!
    隨筆 - 82  文章 - 266  trackbacks - 0
    <2014年10月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678


    點擊這里給楊愛友發消息
    美麗涵涵童裝店
    說我博客名字,給你們打折!

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章檔案

    好友的BLOG

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    轉載自【http://justcoding.iteye.com/blog/1366102】
    Asynchronous JavaScript and XML (Ajax ) 是驅動新一代 Web 站點(流行術語為 Web 2.0 站點)的關鍵技術。Ajax 允許在不干擾 Web 應用程序的顯示和行為的情況下在后臺進行數據檢索。使用 XMLHttpRequest 函數獲取數據,它是一種 API,允許客戶端 JavaScript 通過 HTTP 連接到遠程服務器。Ajax 也是許多 mashup 的驅動力,它可將來自多個地方的內容集成為單一 Web 應用程序。

     

    不過,由于受到瀏覽器的限制,該方法不允許跨域通信。如果嘗試從不同的域請求數據,會出現安全錯誤。如果能控制數 據駐留的遠程服務器并且每個請求都前往同一域,就可以避免這些安全錯誤。但是,如果僅停留在自己的服務器上,Web 應用程序還有什么用處呢?如果需要從多個第三方服務器收集數據時,又該怎么辦?

     

    理解同源策略限制

    同源策略阻止從一個域上加載的腳本獲取或操作另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這意味著瀏覽器隔離來自不同源的內容,以防止它們之間的操作。這個瀏覽器策略很舊,從 Netscape Navigator 2.0 版本開始就存在。

     

    克服該限制的一個相對簡單的方法是讓 Web 頁面向它源自的 Web 服務器請求數據,并且讓 Web 服務器像代理一樣將請求轉發給真正的第三方服務器。盡管該技術獲得了普遍使用,但它是不可伸縮的。另一種方式是使用框架要素在當前 Web 頁面中創建新區域,并且使用 GET 請求獲取任何第三方資源。不過,獲取資源后,框架中的內容會受到同源策略的限制。

     

    克服該限制更理想方法是在 Web 頁面中插入動態腳本元素,該頁面源指向其他域中的服務 URL 并且在自身腳本中獲取數據。腳本加載時它開始執行。該方法是可行的,因為同源策略不阻止動態腳本插入,并且將腳本看作是從提供 Web 頁面的域上加載的。但如果該腳本嘗試從另一個域上加載文檔,就不會成功。幸運的是,通過添加 JavaScript Object Notation (JSON) 可以改進該技術。

    1、什么是JSONP?


    要了解JSONP,不得不提一下JSON,那么什么是JSON ?

    JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss.

    JSONP(JSON with Padding)是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。

     

    2、JSONP有什么用?

    由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、端口)的資源,為了實現跨域請求,可以通過script標簽實現跨域請求,然后在服務端輸出JSON數據并執行回調函數,從而解決了跨域的數據請求。

     

    3、如何使用JSONP?

    下邊這一DEMO實際上是JSONP的簡單表現形式,在客戶端聲明回調函數之后,客戶端通過script標簽向服務器跨域請求數據,然后服務端返回相應的數據并動態執行回調函數。

     

    HTML代碼 (任一 ):

     

    Html代碼  收藏代碼
    1. <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />  
    2. <script type="text/javascript">  
    3.     function jsonpCallback(result) {  
    4.         //alert(result);  
    5.         for(var i in result) {  
    6.             alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.  
    7.         }  
    8.     }  
    9.     var JSONP=document.createElement("script");  
    10.     JSONP.type="text/javascript";  
    11.     JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback";  
    12.     document.getElementsByTagName("head")[0].appendChild(JSONP);  
    13. </script>  
     

    或者

     

    Html代碼  收藏代碼
    1. <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />  
    2. <script type="text/javascript">  
    3.     function jsonpCallback(result) {  
    4.         alert(result.a);  
    5.         alert(result.b);  
    6.         alert(result.c);  
    7.         for(var i in result) {  
    8.             alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.  
    9.         }  
    10.     }  
    11. </script>  
    12. <script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>  

     

    JavaScript的鏈接,必須在function的下面。

     

    服務端PHP代碼 (services.php):

     

    Php代碼  收藏代碼
    1. <?php  
    2.   
    3. //服務端返回JSON數據  
    4. $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);  
    5. $result=json_encode($arr);  
    6. //echo $_GET['callback'].'("Hello,World!")';  
    7. //echo $_GET['callback']."($result)";  
    8. //動態執行回調函數  
    9. $callback=$_GET['callback'];  
    10. echo $callback."($result)";  
     

    如果將上述JS客戶端代碼用jQuery的方法來實現,也非常簡單。

     

    $.getJSON
    $.ajax
    $.get

     

    客戶端JS代碼在jQuery中的實現方式1:

     

    Js代碼  收藏代碼
    1. <script type="text/javascript" src="jquery.js"></script>  
    2. <script type="text/javascript">  
    3.     $.getJSON("http://crossdomain.com/services.php?callback=?",  
    4.     function(result) {  
    5.         for(var i in result) {  
    6.             alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.  
    7.         }  
    8.     });  
    9. </script>  
     

    客戶端JS代碼在jQuery中的實現方式2:

     

    Js代碼  收藏代碼
    1. <script type="text/javascript" src="jquery.js"></script>  
    2. <script type="text/javascript">  
    3.     $.ajax({  
    4.         url:"http://crossdomain.com/services.php",  
    5.         dataType:'jsonp',  
    6.         data:'',  
    7.         jsonp:'callback',  
    8.         success:function(result) {  
    9.             for(var i in result) {  
    10.                 alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.  
    11.             }  
    12.         },  
    13.         timeout:3000  
    14.     });  
    15. </script>  
     

    客戶端JS代碼在jQuery中的實現方式3:

     

    Js代碼  收藏代碼
    1. <script type="text/javascript" src="jquery.js"></script>  
    2. <script type="text/javascript">  
    3.     $.get('http://crossdomain.com/services.php?callback=?', {name: encodeURIComponent('tester')}, function (json) { for(var i in json) alert(i+":"+json[i]); }, 'jsonp');  
    4. </script>  
     

    其中 jsonCallback 是客戶端注冊的,獲取 跨域服務器 上的json數據 后,回調的函數。
    http://crossdomain.com/services.php?callback=jsonpCallback
    這個 url 是跨域服務 器取 json 數據的接口,參數為回調函數的名字,返回的格式為

     

    Js代碼  收藏代碼
    1. jsonpCallback({msg:'this is json data'})  
     

    Jsonp原理: 
    首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。

    此時,服務器先生成 json 數據。
    然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp.

    最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

    客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里.(動態執行回調函數)


    使用JSON的優點在于:

    • 比XML輕了很多,沒有那么多冗余的東西。
    • JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過后的。不像XML這樣的瀏覽器可以直接顯示,瀏覽器對于JSON的格式化的顯示就需要借助一些插件了。
    • 在JavaScript中處理JSON很簡單。
    • 其他語言例如PHP對于JSON的支持也不錯。

    JSON也有一些劣勢:

    • JSON在服務端語言的支持不像XML那么廣泛,不過JSON.org上提供很多語言的庫。
    • 如果你使用eval()來解析的話,會容易出現安全問題。

    盡管如此,JSON的優點還是很明顯的。他是Ajax數據交互的很理想的數據格式。

     

    主要提示:

    JSONP 是構建 mashup 的強大技術,但不幸的是,它并不是所有跨域通信需求的萬靈藥。它有一些缺陷,在提交開發資源之前必須認真考慮它們。

     

    第一,也是最重要的一點,沒有關于 JSONP 調用的錯誤處理。如果動態腳本插入有效,就執行調用;如果無效,就靜默失敗。失敗是沒有任何提示的。例如,不能從服務器捕捉到 404 錯誤,也不能取消或重新開始請求。不過,等待一段時間還沒有響應的話,就不用理它了。(未來的 jQuery 版本可能有終止 JSONP 請求的特性)。

     

    JSONP 的另一個主要缺陷是被不信任的服務使用時會很危險。因為 JSONP 服務返回打包在函數調用中的 JSON 響應,而函數調用是由瀏覽器執行的,這使宿主 Web 應用程序更容易受到各類攻擊。如果打算使用 JSONP 服務,了解它能造成的威脅非常重要。

    posted on 2014-10-29 14:57 楊愛友 閱讀(9374) 評論(5)  編輯  收藏

    FeedBack:
    # AJAX 跨域請求 2014-10-29 17:07 香港服務器
    AJAX 跨域請求 - JSONP獲取JSON數據,這個真的能順利實現嗎?太神奇了。

    獨立ip主機終身3.8折,轉發活動的送wifi額,沒wifi的速度轉發喲。。。。。。。。。。。。  回復  更多評論
      
    # re: AJAX 跨域請求 - JSONP獲取JSON數據 2014-10-29 18:08 楊愛友
    真的能實現,剛做項目已經用上了。  回復  更多評論
      
    # re: AJAX 跨域請求 - JSONP獲取JSON數據 2014-10-30 16:12 寧波倉儲籠
    有一部分沒看懂  回復  更多評論
      
    # re: AJAX 跨域請求 - JSONP獲取JSON數據 2014-11-02 15:21 網絡營銷技巧
    要深入研究研究  回復  更多評論
      
    # re: AJAX 跨域請求 - JSONP獲取JSON數據 2015-02-02 09:44 skyishero
    那個是異步的  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    美麗涵涵童裝店
    親,說我博客名字,給你們打折!
    主站蜘蛛池模板: 亚洲狠狠婷婷综合久久蜜芽| 亚洲国产综合第一精品小说| 曰批免费视频播放在线看片二| 天天摸天天操免费播放小视频| 亚洲国产视频久久| 青春禁区视频在线观看直播免费| 亚洲人成人77777在线播放| 国产成人免费在线| 亚洲an日韩专区在线| 国产免费av片在线看| 亚洲av综合av一区二区三区| 国产jizzjizz免费视频| 免费的黄色的网站| 亚洲乱码精品久久久久..| 成全高清在线观看免费| 一区二区三区亚洲| 思思re热免费精品视频66 | 亚洲VA中文字幕不卡无码| 两个人看的www视频免费完整版| 国产成人亚洲综合色影视| 日韩人妻一区二区三区免费| 亚洲中文无码a∨在线观看| 在线a人片天堂免费观看高清| WWW国产亚洲精品久久麻豆| 亚洲日韩在线中文字幕第一页| 亚洲免费观看视频| 亚洲人成777在线播放| 又爽又高潮的BB视频免费看| a在线免费观看视频| 亚洲一卡2卡4卡5卡6卡在线99| 国产免费观看青青草原网站| 中国一级毛片视频免费看| 亚洲国产精品综合久久2007| 国产成人免费a在线资源| 一区二区三区无码视频免费福利| 亚洲日本香蕉视频| 免费在线观看理论片| 在线播放免费人成毛片乱码| 2020天堂在线亚洲精品专区| 亚洲中文字幕无码中文字在线| 131美女爱做免费毛片|