深入跨域問題(3) - 利用 JSONP 解決跨域

深入跨域問題(1) - 初識(shí) CORS 跨域資源共享

深入跨域問題(2) - 利用 CORS 解決跨域

深入跨域問題(3) - 利用 JSONP 解決跨域(本篇)

深入跨域問題(4) - 利用 代理解決跨域

什么是跨域,在這篇文章內(nèi)部就不再講述了止状,在第一篇文章里面查看遂鹊,本文主要著重于實(shí)現(xiàn) JSONP 的原理 鸣皂。

script 標(biāo)簽:

根據(jù)同源策略的限制,在 端口钧椰,域名,協(xié)議 這三者 一個(gè)或者多個(gè)不同的情況下 符欠,就會(huì)出現(xiàn)跨域限制嫡霞。

但是,<script> 標(biāo)簽訪問時(shí)希柿,可以跨越這些同源策略限制诊沪,但只能使用 GET 方法:

簡(jiǎn)單例子:

JSONP 的運(yùn)用十分廣泛养筒,各大網(wǎng)站都有使用:豆瓣,QQ音樂等端姚;下面是 QQ音樂的 簡(jiǎn)單 JSONP 接口:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Ajax測(cè)試</title>
</head>
     
<body>
    <script>
        function jsonCallback(data) {
            console.log(data);
        }
    </script>
    <script src="https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg"></script>
</body>

</html>

直接打開此鏈接:

[圖片上傳失敗...(image-7890ae-1526541599658)]

你可以看到晕粪,上述返回信息是,調(diào)用 jsonCallback() 函數(shù)渐裸,并傳遞 一個(gè)JSON 字符串巫湘。

打開控制臺(tái),你就可以看到:

image

上述實(shí)現(xiàn)原理:

  1. 利用 script 標(biāo)簽昏鹃,規(guī)避跨域尚氛,<script src="url">
  2. 在客戶端聲明一個(gè)函數(shù)洞渤,function jsonCallback() {}阅嘶。
  3. 在服務(wù)端根據(jù)客戶端傳來的信息,查找數(shù)據(jù)庫您宪,然后返回?cái)?shù)據(jù)并調(diào)用 jsonCallback() 函數(shù)奈懒。

其中,感覺上最難的一點(diǎn)是宪巨,如何實(shí)現(xiàn)返回?cái)?shù)據(jù)磷杏,并 調(diào)用客戶端函數(shù) ?事實(shí)上很簡(jiǎn)單捏卓,請(qǐng)往下看极祸。

基本實(shí)現(xiàn)

在這個(gè)部分里,我們將基本實(shí)現(xiàn)這個(gè)流程怠晴。

客戶端代碼:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Ajax測(cè)試</title>
</head>
     
<body>
    
    <script>
        function jsonpCallback(data) {
            console.log(data);
        }
    </script>

    <script src="http://localhost:3000"></script>
</body>

</html>

服務(wù)器端代碼:

const http = require('http');

var data  = { name: 'BruceLee', password: '123456' };

const server = http.createServer((request, response) => {

    if (request.url === '/') {
        response.writeHead(200, { 
            'Content-Type': 'application/json;charset=utf-8' 
        });

        response.end( "jsonpCallback(" + JSON.stringify(data) + ")" );
    }

});

server.listen(3000, () => {
    console.log('The server is running at http://localhost:3000');
});

在這里遥金,我們最后直接返回一個(gè) 字符串 給客戶端,<script> 標(biāo)簽將直接運(yùn)行 字符串 里面的內(nèi)容 K馓铩8逍怠!

image

這就是冲粤,基本的前后端美莫,使用 JSONP 解決跨域問題的方案 。

JSONPCORS 的對(duì)比

JSONP 是很早很成熟的解決方案梯捕,但是厢呵,只能進(jìn)行 GET 請(qǐng)求,無法實(shí)現(xiàn)上傳數(shù)據(jù)等操作傀顾。

反觀:CORS 雖然分 預(yù)請(qǐng)求非預(yù)請(qǐng)求 襟铭,但是,無疑支持的功能是非常強(qiáng)大的 !:赐劣!

參考與感謝

感謝上述兩篇鏈接的作者,他們讓我明白了 JSONP 的實(shí)質(zhì) 入撒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隆豹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茅逮,更是在濱河造成了極大的恐慌,老刑警劉巖判哥,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件献雅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡塌计,警方通過查閱死者的電腦和手機(jī)挺身,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌仅,“玉大人章钾,你說我怎么就攤上這事∪惹郏” “怎么了贱傀?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伊脓。 經(jīng)常有香客問我府寒,道長,這世上最難降的妖魔是什么报腔? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任株搔,我火速辦了婚禮,結(jié)果婚禮上纯蛾,老公的妹妹穿的比我還像新娘纤房。我一直安慰自己,他們只是感情好翻诉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布炮姨。 她就那樣靜靜地躺著,像睡著了一般米丘。 火紅的嫁衣襯著肌膚如雪剑令。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天拄查,我揣著相機(jī)與錄音吁津,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碍脏,可吹牛的內(nèi)容都是我干的梭依。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼典尾,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼役拴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钾埂,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤河闰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后褥紫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜性,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年髓考,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了部念。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氨菇,死狀恐怖儡炼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情查蓉,我是刑警寧澤乌询,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奶是,受9級(jí)特大地震影響楣责,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聂沙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一秆麸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧及汉,春花似錦沮趣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至温眉,卻和暖如春缸匪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背类溢。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工凌蔬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留露懒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓砂心,卻偏偏與公主長得像懈词,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辩诞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架坎弯,建立于...
    Hsinwong閱讀 22,403評(píng)論 1 92
  • 本節(jié)內(nèi)容:實(shí)現(xiàn)跨域常用的兩種方式 —— JSONP 和 CORS 零:跨域報(bào)錯(cuò)展示 在非同源情況下,調(diào)用 Ajax...
    NathanYangcn閱讀 3,250評(píng)論 2 12
  • http協(xié)議 Resource译暂,URL抠忘,Request,Response秧秉,Headers http 請(qǐng)求的是資源R...
    Sharise_Mo佩珊閱讀 692評(píng)論 0 4
  • 上午在臺(tái)中南禪寺褐桌,釋迦摩尼,功德箱象迎。靜靜地站在窗前,祈禱能夠和熊孩子重新開始呛踊,我會(huì)更好的砾淌,懂事一點(diǎn),也希望他能表達(dá)...
    ALsoon閱讀 135評(píng)論 0 0
  • 噠噠的馬蹄碾碎一場(chǎng)清夢(mèng) 你駕著長車駛進(jìn)太陽里 太陽五年不再回來 日落的方向嫣紅如夢(mèng) 我們終將陪它一起老去 我們都知...
    沐楓集閱讀 262評(píng)論 2 4