1. 程式人生 > >利用jsonp實現跨域請求

利用jsonp實現跨域請求

get p地址 doc ajax請求 -s tar 原理 安全策略 都是

  同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議,端口相同。當一個瀏覽器的兩個tab頁中分別打開來 百度和谷歌的頁面當瀏覽器的百度tab頁執行一個腳本的時候會檢查這個腳本是屬於哪個頁面的,即檢查是否同源,只有和百度同源的腳本才會被執行。如果非同源,那麽在請求數據時,瀏覽器會在控制臺中報一個異常,提示拒絕訪問。

  由於同源策略,我們在使用ajax請求資源時不能跨域請求,也就是說必須是同一個域名,協議,端口。但我們在開發的時候經常會需要請求到其他服務器(跨域)的數據,其中一種方法就是jsonp。

  另外提一下,一般都是使用json這種數據格式來傳遞數據,因為javascript原生支持json格式,所以使用起來很方便。不要把json和jsonp混淆了,他們根本不是一個次元的東西!!!比如說兩個中國人進行對話,json就是漢語(具體內容),而jsonp就是兩個人交流的方式(用嘴)。

什麽是jsonp? 

  我們都知道script標簽是可以跨域請求的,例如我們引入jquery.js的時候經常使用cdn上的資源,並沒有把jquery.js這個文件真正地下載到自己的服務器上。那麽利用script可以跨域請求的特性,我們就能請求其他服務器的資源。這種技術也就是所謂的jsonp。多說無益,下面是一個簡單的實例,看了之後相信你就能對jsonp的原理有了理解。 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>

<script>
    var demo1 = function (data) {
        alert("我是後臺通過jsonp傳來的數據:" + data.name);
    }
</script>
<script src="http://遠程服務器域名或ip地址/jsonp/jsonp.js"></script>  <!--這裏為了保護我的服務器不受攻擊,就不放出我的服務器地址啦,哈哈哈-->
</body> </html>

  

請求的服務器下面有對應的jsonp.js(名字自己起,不一定是jsonp.js)這個文件,裏面的代碼如下:

demo1({"name": "lin"}); /*在遠程服務器上的js代碼,也就是說該服務器上的數據我們都可以傳入函數,那麽html執行的時候也就獲取到了這些遠程數據*/

  html文件渲染如下,可見遠程服務器的數據已經被請求過來:

  技術分享

  

  工作流程解析:我們先在html定義了demo1這個函數,然後引入遠程jsonp.js文件,該js文件執行html定義的demo1函數(執行時傳入的參數就是想要傳遞的數據)。這樣html也就變相的獲取到了遠程服務器的數據。

 

   總結:其實不只是script可以跨域請求,只要有src屬性的標簽都可以借助同樣的原理進行跨域請求,例如img, iframe

  

利用jsonp實現跨域請求