跨域

跨域指的是訪問(wèn)不同源的url資源赂韵。
瀏覽器出于對(duì)安全方面的考慮族淮,只允許與本域中的接口進(jìn)行交互。不同源的的客戶端在沒(méi)有明確授權(quán)的情況下锐帜,不能讀寫對(duì)方的資源。
本域指的是
1.同協(xié)議 例如都是 http 或者 https
2.同域名 例如都是 baidu.com
3.同端口 例如都是 8080 端口

同源的例子
https://www.baidu.com/ahttps://www.baidu.com/b

不同源的例子
http://www.baidu.comhttps://www.baidu.com 協(xié)議不同
http://www.baidu.comhttp://taobao.com 域名不同
http://www.baidu.com:8081http://www.baidu.com:8080 端口不同

需要注意的是: 對(duì)于當(dāng)前頁(yè)面來(lái)說(shuō)頁(yè)面存放的 JS 文件的域不重要畜号,重要的是加載該 JS 頁(yè)面所在什么域缴阎。瀏覽器允許引用不同域的js,但是js發(fā)起ajax請(qǐng)求時(shí)简软,瀏覽器會(huì)判斷當(dāng)前域药蜻,與請(qǐng)求域是否一致,如果不一致替饿,會(huì)拒絕接收請(qǐng)求域返回的數(shù)據(jù)语泽。

如何跨域?

1.JSONP

1.1 首先在瀏覽器腳本中定義一個(gè)callBack函數(shù)

1.2 創(chuàng)建一個(gè)script腳本视卢,并將script的src寫為需要訪問(wèn)的接口地址踱卵,
同時(shí)帶上請(qǐng)求回調(diào)時(shí)的方法名稱,這樣服務(wù)端在返回?cái)?shù)據(jù)時(shí)据过,將數(shù)據(jù)拼接在方法名
中惋砂,瀏覽器讀到腳本后,執(zhí)行該函數(shù)绳锅,函數(shù)里可獲得數(shù)據(jù)進(jìn)行處理.


代碼

客戶端
var script = document.createElement('script')
script.src = 'http://localhost:8000?callBack=callBack'
document.head.appendChild(script)
function callBack(data){
      console.log(data.username)
      console.log(data.password)
}

服務(wù)端
var http = require('http')
var url = require('url')
http.createServer(function(req,res){
    var pathObj = url.parse(req.url,true)
    var query = pathObj.query
    var callBack = query.callBack
    var data = {username:'jack',password:'123456'}
    res.end(callBack + '(' + JSON.stringify(data) + ')')
}).listen(8000)

總結(jié)西饵,jsonp跨域原理是通過(guò)<script>標(biāo)簽引用接口,并且在本地定義好一個(gè)處理數(shù)據(jù)的函數(shù)鳞芙,將函數(shù)名稱傳遞后服務(wù)端眷柔,服務(wù)端接收到請(qǐng)求后,將數(shù)據(jù)放在拼裝好的函數(shù)名稱中原朝,從而達(dá)到<script>標(biāo)簽請(qǐng)求完成后驯嘱,執(zhí)行函數(shù),做到跨域數(shù)據(jù)處理喳坠。

2.CORS

客戶端
var xhr = new XMLHttpRequest();
xhr.open('GET','http://localhost:8000',true)
xhr.onload = function(){
    if(xhr.status == 200){
        data = JSON.parse(xhr.responseText)
        console.log(data.username)
        console.log(data.password)
    }
}
xhr.send()

服務(wù)端
var http = require('http')
http.createServer(function (req,res) {
    res.setHeader('Access-Control-Allow-Origin','*')
    var data = {username:'jack',password:'123456'}
    res.end(JSON.stringify(data))
}).listen(8000)

當(dāng)客戶端發(fā)送一個(gè)跨域請(qǐng)求時(shí)鞠评,瀏覽器會(huì)自動(dòng)在request header上加上
Origin:http://localhost:80801(當(dāng)前源)給服務(wù)端端

服務(wù)端如果允許跨域請(qǐng)求的話,可以通過(guò)在 response header上加上
Access-Control-Allow-Origin:源地址或者* (*代表的是所有的源都可以請(qǐng)求)
來(lái)允許某些或者所有的源獲取數(shù)據(jù)壕鹉,當(dāng)返回給客戶端后剃幌,瀏覽器會(huì)拿服務(wù)端返回的
Access-Control-Allow-Origin和客戶端的Origin進(jìn)行對(duì)比聋涨,如果匹配上了的話,客戶端可以正常使用返回的數(shù)據(jù)负乡,否則無(wú)法使用返回的數(shù)據(jù)牛郑。

3.降域

降域指的是,兩個(gè)不同源的頁(yè)面通過(guò)document.domain指定一級(jí)域名敬鬓,并且他們的一級(jí)域名相同淹朋,然后來(lái)達(dá)到相互訪問(wèn)對(duì)方頁(yè)面元素的跨域操作。(一級(jí)域名的意思請(qǐng)百度)

http://a.local.com:8000/a.html

<div>
    <h1>I am a Page</h1>
</div>
<div>
    <iframe src="http://b.local.com:8000/b.html"></iframe>
</div>
<script>
    document.domain = 'local.com'
    console.log(window.frames[0].document.head)
</script>


http://b.local.com:8000/b.html

<h1>I'm b Page</h1>
<script>
    document.domain = 'local.com'
</script>

4.postMessage

采用 window.postMessage(this.value,'') 向目標(biāo)窗口(window)發(fā)送一個(gè)message類型的消息钉答,第一個(gè)參數(shù)是數(shù)據(jù)础芍,第二個(gè)參數(shù)是源名稱(代表所有源都可以接收,或者固定為固定的源数尿,例如http://localhost:8080),
目標(biāo)窗口通過(guò)addEventListener('message')的方式得到數(shù)據(jù)仑性,實(shí)現(xiàn)跨域操作。

a.html
<div>
    <h1>I am a Page</h1>
    <input>
</div>
<div>
    <iframe src="http://b.local.com:8000/b.html"></iframe>
</div>
<script>
    document.querySelector('input').addEventListener('input',function () {
        window.frames[0].postMessage(this.value,'*')
    })
</script>

b.html
<h1>I'm b Page</h1>
<input>
<script>
addEventListener('message',function (e) {
    console.log(e.data)
    document.querySelector('input').value = e.data
})
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末右蹦,一起剝皮案震驚了整個(gè)濱河市诊杆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌何陆,老刑警劉巖晨汹,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贷盲,居然都是意外死亡淘这,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門巩剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铝穷,“玉大人,你說(shuō)我怎么就攤上這事佳魔∈锬簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鞠鲜,是天一觀的道長(zhǎng)宁脊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)镊尺,這世上最難降的妖魔是什么朦佩? 我笑而不...
    開(kāi)封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任并思,我火速辦了婚禮庐氮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宋彼。我一直安慰自己弄砍,他們只是感情好仙畦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著音婶,像睡著了一般慨畸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衣式,一...
    開(kāi)封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天寸士,我揣著相機(jī)與錄音,去河邊找鬼碴卧。 笑死弱卡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的住册。 我是一名探鬼主播婶博,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荧飞!你這毒婦竟也來(lái)了凡人?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叹阔,失蹤者是張志新(化名)和其女友劉穎挠轴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耳幢,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忠荞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帅掘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片委煤。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖修档,靈堂內(nèi)的尸體忽然破棺而出碧绞,到底是詐尸還是另有隱情,我是刑警寧澤吱窝,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布讥邻,位于F島的核電站,受9級(jí)特大地震影響院峡,放射性物質(zhì)發(fā)生泄漏兴使。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一照激、第九天 我趴在偏房一處隱蔽的房頂上張望发魄。 院中可真熱鬧,春花似錦、人聲如沸励幼。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苹粟。三九已至有滑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嵌削,已是汗流浹背毛好。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苛秕,地道東北人睛榄。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像想帅,于是被迫代替她去往敵國(guó)和親场靴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮港准,只允許與本...
    FLYSASA閱讀 1,721評(píng)論 0 6
  • 一旨剥、同源策略 什么是瀏覽器的同源策略?瀏覽器出于安全考慮浅缸,只允許相同域下的資源進(jìn)行交互轨帜,不同源下的腳本在沒(méi)有明確授...
    Da_xiong閱讀 524評(píng)論 0 1
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本衩椒。它是由瀏覽器的同源策略造成的蚌父,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,299評(píng)論 0 6
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本毛萌。它是由瀏覽器的同源策略造成的苟弛,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,064評(píng)論 0 2
  • 在我剛來(lái)到這家店之前膏秫,我在培訓(xùn)部見(jiàn)過(guò)你,只限于見(jiàn)過(guò)做盅,未曾有過(guò)語(yǔ)言的交流缤削。那個(gè)時(shí)候就對(duì)你充滿興趣,希望能夠與你一起學(xué)...
    青心爭(zhēng)己閱讀 567評(píng)論 0 0