JSONP實現(xiàn)跨域

什么是JSONP

JSONP的英文全稱是 JSON with padding
值得注意的是這里的padding應(yīng)當(dāng)譯作使用方式圈膏,因此JSONP應(yīng)當(dāng)譯作——JSON的一種使用方式


JSONP的原理

由于同源策略蠢络,使得不同源的兩個頁面之間無法相互訪問桦山,然而HTML的script標(biāo)簽是個例外。利用這個特點膀捷,我們可以通過script標(biāo)簽來獲取其它不同源網(wǎng)頁的JSON數(shù)據(jù)——這種使用方式被稱為JSONP
它的核心是繞過瀏覽器的同源策略


實現(xiàn)JSONP的方式

  1. 比如我們用script標(biāo)簽請求一些數(shù)據(jù)尽狠,假設(shè)請求用戶定位的信息
<script src="http://http://www.bbwtest.com/users_location.json"></script>

問題在于,script標(biāo)簽會被當(dāng)成js代碼立即執(zhí)行严卖,但我們需要的是一些數(shù)據(jù)
所以,此時就需要后端的配合

  1. 我們把script標(biāo)簽改一下布轿,加上一些查詢字符串
<script src="http://http://www.bbwtest.com/users_location.json?callback=showData"></script>

原本當(dāng)后端收到這個請求時哮笆,我們希望得到一個{“name”:”bluesbonewong”,”age”:16}這種json類型的數(shù)據(jù),但由于script標(biāo)簽會被當(dāng)做js代碼立即執(zhí)行汰扭,所以我們希望后端收到請求后返回一個函數(shù)稠肘,如

showData({“name”:”bluesbonewong”,”age”:16})

那么此時前端只需要在數(shù)據(jù)返回前聲明一個全局函數(shù)showData即可,如

function showData(data){
    return data
}

實現(xiàn)代碼

注意修改host文件使得不同域名映射至同一個IP地址萝毛,即可測試JSONP跨域


服務(wù)端代碼

var http = require('http')
var fs = require('fs')
var path = require('path')
var url = require('url')

var server = http.createServer(function (request, response) {
    var pathObj = url.parse(request.url, true)
    console.log(pathObj)

    switch (pathObj.pathname) {
        case '/getdata':
            var data = {"name": "bluesbonewong", "age": 16}
            response.setHeader('content-type', 'text/json;charset=utf-8')
            // 以下是重點
            if (pathObj.query.callback) {
                // 判斷查詢字符串中是否有callback
                response.end(pathObj.query.callback + '(' + JSON.stringify(data) + ')')
                // 返回一個 showData(JSON.stringify(data)) 函數(shù)
                console.log(data)
                // 這里data會被自動轉(zhuǎn)換為對象格式{ name: 'bluesbonewong', age: 16 }雙引號會被去除
                // 所以一定要用JSON.stringify()把數(shù)據(jù)轉(zhuǎn)換為json格式
            } else {
                response.end(data)
            }
            // 以上是重點
            break
        // 以下不用看
        default:
            fs.readFile(path.join(__dirname, pathObj.pathname), function (error, data) {
                if (error) {
                    response.writeHead(404, 'not found')
                    response.end('<h1>not found</h1>')
                } else {
                    response.end(data)
                }
            })
    }
})

console.log('請在瀏覽器地址欄輸入 localhost:8080')
server.listen(8080)

HTML代碼

<!doctype html>
<html lang="ch">
<head>
    <meta charset="utf-8">
    <title>使用JSONP跨域</title>
</head>
<body>
<h1>JSONP實現(xiàn)跨域</h1>
<script>
    // JSONP
    function addScript() {
        var script = document.createElement('script')
        script.src = 'http://justfun:8080/getdata?callback=showData'
        document.head.appendChild(script)
        // 添加標(biāo)簽后會立即執(zhí)行项阴,且在數(shù)據(jù)到來之前,會阻斷其它加載
        document.head.removeChild(script)
        // 移除也沒關(guān)系笆包,因為數(shù)據(jù)此時已經(jīng)拿到
    }

    function showData(data) {
        console.log(data)
    }

    addScript()
    showData()
</script>
</body>
</html>

代碼GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末环揽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庵佣,更是在濱河造成了極大的恐慌歉胶,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巴粪,死亡現(xiàn)場離奇詭異通今,居然都是意外死亡,警方通過查閱死者的電腦和手機验毡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門衡创,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晶通,你說我怎么就攤上這事璃氢。” “怎么了狮辽?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵一也,是天一觀的道長。 經(jīng)常有香客問我喉脖,道長椰苟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任树叽,我火速辦了婚禮舆蝴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己洁仗,他們只是感情好层皱,可當(dāng)我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赠潦,像睡著了一般叫胖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上她奥,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天瓮增,我揣著相機與錄音,去河邊找鬼哩俭。 笑死绷跑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的携茂。 我是一名探鬼主播你踩,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼诅岩,長吁一口氣:“原來是場噩夢啊……” “哼讳苦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吩谦,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鸳谜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后式廷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咐扭,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年滑废,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝗肪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蠕趁,死狀恐怖薛闪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俺陋,我是刑警寧澤豁延,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站腊状,受9級特大地震影響诱咏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缴挖,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一袋狞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦苟鸯、人聲如沸法焰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埃仪。三九已至,卻和暖如春陕赃,著一層夾襖步出監(jiān)牢的瞬間卵蛉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工么库, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傻丝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓诉儒,卻偏偏與公主長得像葡缰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忱反,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,587評論 2 350

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