JSONP跨域請求講解

一、同源策略

要理解跨域酷窥,先要了解一下“同源策略”咽安。所謂同源是指,域名蓬推,協(xié)議妆棒,端口相同。所謂“同源策略“,簡單的說就是基于安全考慮糕珊,當(dāng)前域不能訪問其他域的東西蛋铆。

一些常見的是否同源示例可參照下表:


同源策略圖

在同源策略下,在某個(gè)服務(wù)器下的頁面是無法獲取到該服務(wù)器以外的數(shù)據(jù)的放接。例如我們在自己的網(wǎng)站通過ajax去獲取豆瓣上https://developers.douban.com/wiki/?title=api_v2提供的接口數(shù)據(jù)。這里我們以搜索圖書為例留特,參數(shù)鏈接為:https://api.douban.com/v2/book/search?q=javascript&count=1纠脾,該鏈接中數(shù)據(jù)為JSON格式,如下:


我通過如下代碼去訪問該數(shù)據(jù):


運(yùn)行之后會報(bào)錯(cuò):


二蜕青、JSONP

JSONP 是 JSON with padding(填充式 JSON 或參數(shù)式 JSON)的簡寫苟蹈。

JSONP實(shí)現(xiàn)跨域請求的原理簡單的說,就是動態(tài)創(chuàng)建標(biāo)簽右核,然后利用的src 不受同源策略約束來跨域獲取數(shù)據(jù)慧脱。

JSONP 由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)『睾龋回調(diào)函數(shù)是當(dāng)響應(yīng)到來時(shí)應(yīng)該在頁面中調(diào)用的函數(shù)菱鸥。回調(diào)函數(shù)的名字一般是在請求中指定的躏鱼。而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的 JSON 數(shù)據(jù)氮采。

動態(tài)創(chuàng)建<sript>標(biāo)簽,設(shè)置其src染苛,回調(diào)函數(shù)在src中設(shè)置:標(biāo)簽鹊漠,設(shè)置其src,回調(diào)函數(shù)在src中設(shè)置:

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

script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";

document.body.insertBefore(script, document.body.firstChild);

在頁面中茶行,返回的JSON作為參數(shù)傳入回調(diào)函數(shù)中躯概,我們通過回調(diào)函數(shù)來來操作數(shù)據(jù)。

functionhandleResponse(response){

? ? ? ? // 對response數(shù)據(jù)進(jìn)行操作代碼

}

了解了JSONP的基本使用方法畔师,我們在實(shí)現(xiàn)上面通過ajax調(diào)用豆瓣接口的需求娶靡,實(shí)現(xiàn)代碼如下:


在控制臺,我們可以查看到返回的response數(shù)據(jù)格式為JSON對象格式的茉唉,具體需要取出哪些參數(shù)固蛾,可以根據(jù)自己的需要:


JSONP目前還是比較流行的跨域方式,雖然JSONP使用起來方便度陆,但是也存在一些問題:?

首先艾凯, JSONP 是從其他域中加載代碼執(zhí)行。如果其他域不安全懂傀,很可能會在響應(yīng)中夾帶一些惡意代碼趾诗,而此時(shí)除了完全放棄 JSONP 調(diào)用之外,沒有辦法追究。因此在使用不是你自己運(yùn)維的 Web 服務(wù)時(shí)恃泪,一定得保證它安全可靠郑兴。

其次,要確定 JSONP 請求是否失敗并不容易贝乎。雖然 HTML5 給<script>元素新增了一個(gè)onerror事件處理程序情连,但目前沒有得到任何瀏覽器的支持。因此開發(fā)人員不得不使用計(jì)時(shí)器檢測時(shí)間內(nèi)是否接收到了響應(yīng)览效。元素新增了一個(gè) onerror事件處理程序却舀,但目前還沒有得到任何瀏覽器支持。為此锤灿,開發(fā)人員不得不使用計(jì)時(shí)器檢測指定時(shí)間內(nèi)是否接收到了響應(yīng)挽拔。

二、jQuery封裝JSONP

對于經(jīng)常用jQuery的開發(fā)者來說但校,能注意到j(luò)Query封裝的$.ajax中有一個(gè)dataType屬性螃诅,如果將該屬性設(shè)置成dataType:"jsonp",就能實(shí)現(xiàn)JSONP跨域了状囱。需要了解的一點(diǎn)是术裸,雖然jQuery將JSONP封裝在$.ajax中,但是其本質(zhì)與$.ajax不一樣浪箭。

通過jQuery的$.ajax實(shí)現(xiàn)跨域的代碼參考如下


最后的結(jié)果與JavaScript通過動態(tài)添加<script>標(biāo)簽得到的結(jié)果是一樣的穗椅。標(biāo)簽得到的結(jié)果是一樣的。


通過$.getJSON()

利用getJSON來實(shí)現(xiàn)奶栖,只要在地址中加上callback=?參數(shù)即可匹表,參考代碼如下:

$.getJSON("https://api.douban.com/v2/book/search?q=javascript&count=1&callback=?", function(data){

? ? ? ? console.log(data);

});

這樣也能實(shí)現(xiàn)跨域的功能。

注:轉(zhuǎn)載自? ? https://blog.csdn.net/u014607184/article/details/52027879? 宣鄙,感謝樓主分享袍镀,解決了我的問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冻晤,隨后出現(xiàn)的幾起案子苇羡,更是在濱河造成了極大的恐慌,老刑警劉巖鼻弧,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件设江,死亡現(xiàn)場離奇詭異,居然都是意外死亡攘轩,警方通過查閱死者的電腦和手機(jī)叉存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來度帮,“玉大人歼捏,你說我怎么就攤上這事稿存。” “怎么了瞳秽?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵瓣履,是天一觀的道長。 經(jīng)常有香客問我练俐,道長袖迎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任腺晾,我火速辦了婚禮瓢棒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丘喻。我一直安慰自己,他們只是感情好念颈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布泉粉。 她就那樣靜靜地躺著,像睡著了一般榴芳。 火紅的嫁衣襯著肌膚如雪嗡靡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天窟感,我揣著相機(jī)與錄音讨彼,去河邊找鬼。 笑死柿祈,一個(gè)胖子當(dāng)著我的面吹牛哈误,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躏嚎,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蜜自,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卢佣?” 一聲冷哼從身側(cè)響起重荠,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虚茶,沒想到半個(gè)月后戈鲁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹叫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年婆殿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片待笑。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸣皂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寞缝,我是刑警寧澤癌压,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站荆陆,受9級特大地震影響滩届,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜被啼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一帜消、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浓体,春花似錦泡挺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至生闲,卻和暖如春媳溺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碍讯。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工悬蔽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉兴。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓蝎困,卻偏偏與公主長得像,于是被迫代替她去往敵國和親倍啥。 傳聞我的和親對象是個(gè)殘疾皇子难衰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一、同源策略 要理解跨域逗栽,先要了解一下“同源策略”盖袭。所謂同源是指,域名彼宠,協(xié)議鳄虱,端口相同。所謂“同源策略“凭峡,簡單的說...
    前端楊肖閱讀 271評論 0 0
  • 前言:對于跨域請求拙已,很早之前就有去了解過,但因?yàn)橐恢标P(guān)注的都是服務(wù)器后端開發(fā)摧冀,故也就僅僅停留在概念的理解上而沒有機(jī)...
    ken_ljq閱讀 89,743評論 6 128
  • 1. 什么是同源策略 瀏覽器限制不同源的兩個(gè)網(wǎng)站間腳本和文本的相互訪問倍踪,只允許訪問同源下的內(nèi)容系宫。所謂同源,就是指兩...
    熊蛋子17閱讀 684評論 1 6
  • 寫在前面 1. 優(yōu)秀文章:各組長推薦1篇建车,值月小組投票決定選擇前3名扩借。這并不代表其他文章就不優(yōu)秀了,優(yōu)秀是多維的缤至,...
    月牙年輪閱讀 709評論 0 8
  • 1.貝葉斯定理:根據(jù)事實(shí)調(diào)整主觀概率潮罪。根據(jù)最新信息調(diào)高調(diào)低可信度。 2.一個(gè)箱子领斥,里面有一百個(gè)球嫉到,不知道白球黑球各...
    琢磨概念者閱讀 574評論 0 0