ajax跨域請求

JSNOP是一個非官方的協議,它允許在服務器端集成script tags返回至客戶端,通過JavaScript callback的形式實現跨域訪問。

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

使用jsonp:

a.第一種方法

<meta??? content="text/html;chartset=utf-8"???? http-equiv="Content-Type">

<script>

function jsonpCallback(result) {

//alert(result);

for(var?i?in?result)?{

alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.

}

}

var???? JSONP=document.createElement("script");

JSONP.type="text/javascript";

JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback";

document.getElementsByTagName("head")[0].appendChild(JSONP);

</script>

b.第二種方法

<meta? ? content="text/html;chartset=utf-8"? ? http-equiv="Content-Type">

<script? type="text/javascript">

function jsonpCallback(result) {

alert(result.a);

alert(result.b);

alert(result.c);

for(var?i?in?result)?{

alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.

}

}

</script>

<script???? type="text/javascript"????? src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>

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

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

<?php

//服務端返回JSON數據

$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

$result=json_encode($arr);

//echo ? $_GET['callback'].'("Hello,World!")';

//echo?? $_GET['callback']."($result)";

//動態執行回調函數

$callback=$_GET['callback'];

echo??? $callback."($result)";

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

$.getJSON

$.ajax

$.get

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

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

$.getJSON("http://crossdomain.com/services.php?callback=?",

function(result)?{

for?? (var?? i?? in???? result)?{

alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.

}

});

</script>

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

<script type="text/javascript"? src="jquery.js"></script>

<script type="text/javascript">

$.ajax({

url:"http://crossdomain.com/services.php",

dataType:'jsonp',

data:'',

jsonp:'callback',

success:function(result)?{

for(variinresult)?{

alert(i+":"+result[i]);//循環輸出a:1,b:2,etc.

}

},

timeout:3000

});

</script>

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

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

$.get('http://crossdomain.com/services.php?callback=?', {name: encodeURIComponent('tester')},function(json) {for(variinjson) alert(i+":"+json[i]); },'jsonp');

</script>

其中 jsonCallback 是客戶端注冊的,獲取跨域服務器上的json數據后,回調的函數。

http://crossdomain.com/services.php?callback=jsonpCallback

這個 url 是跨域服務器取 json 數據的接口,參數為回調函數的名字,返回的格式為Js代碼:
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 服務,了解它能造成的威脅非常重要。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容