跨域

什么是同源策略脑沿?

同源策略 是由Netscape提出的一個著名的安全策略泪酱,現(xiàn)在所有支持JavaScript 的瀏覽器都會使用這個策略衔蹲。這種策略只是一個規(guī)范,并不是強(qiáng)制要求芭逝,各大廠商的瀏覽器只是針對同源策略的一種實(shí)現(xiàn)塌碌。它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略旬盯,則瀏覽器的正常功能可能都會受到影響誊爹。

同源是指:
為什么要有同源限制蹬刷?

如果沒有同源策略黑客很容易竊取密碼與用戶信息。
瀏覽器出于安全方面的考慮频丘,只允許與本域下的接口交互办成。不同源的客戶端腳本在沒有明確授權(quán)的情況下,不能讀寫對方的資源搂漠。

什么是跨域迂卢?

跨域是指從一個域名的網(wǎng)頁去請求另一個域名的資源。比如從www.baidu.com 頁面去請求 www.google.com 的資源桐汤。
跨域的嚴(yán)格一點(diǎn)的定義是:只要 協(xié)議而克,域名,端口有任何一個的不同怔毛,就被當(dāng)作是跨域员萍。

同源:
http://jirengu.com/a/b.jshttp://jirengu.com/index.php
不同源:
http://jirengu.com/main.jshttps://jirengu.com/a.php (協(xié)議不同)
http://jirengu.com/main.jshttp://bbs.jirengu.com/a.php (域名不同,域名必須完全相同才可以)
http://jiengu.com/main.jshttp://jirengu.com:8080/a.php (端口不同,第一個是80)

c.png

注意: 對于當(dāng)前頁面來說頁面存放的 JS 文件的域不重要拣度,重要的是加載該 JS 頁面所在什么域

跨域的幾種實(shí)現(xiàn)方法:
  1. jsonp
  2. CORS:跨域資源共享(Cross-Origin Resource Sharing)
  3. 降域
  4. postMessage()
JSONP原理

利用<script>標(biāo)簽沒有跨域限制來達(dá)到與第三方通訊的目的碎绎。當(dāng)需要通訊時,本站腳本創(chuàng)建一個<script>元素抗果,地址指向第三方的API網(wǎng)址筋帖,形如:
<script src="http://www.example.net/api?param1=1&param2=2"></script>
并提供一個回調(diào)函數(shù)來接收數(shù)據(jù)(函數(shù)名可約定,或通過地址參數(shù)傳遞)冤馏。
第三方產(chǎn)生的響應(yīng)為json數(shù)據(jù)的包裝(故稱之為jsonp日麸,即json padding),形如:
callback({"name":"hax","gender":"Male"})
這樣瀏覽器會調(diào)用callback函數(shù)逮光,并傳遞解析后json對象作為參數(shù)代箭。本站腳本可在callback函數(shù)里處理所傳入的數(shù)據(jù)。

CORS是什么涕刚?

CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing)梢卸,是一種 ajax 跨域請求資源的方式。
IE支持10以上副女。當(dāng)你使用 XMLHttpRequest 發(fā)送請求時蛤高,瀏覽器發(fā)現(xiàn)該請求不符合同源策略,會給該請求加一個請求頭:Origin碑幅,后臺進(jìn)行一系列處理戴陡,如果確定接受請求則在返回結(jié)果中加入一個響應(yīng)頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值,如果有則瀏覽器會處理響應(yīng)沟涨,我們就可以拿到響應(yīng)數(shù)據(jù)恤批,如果不包含瀏覽器直接駁回,這時我們無法拿到響應(yīng)數(shù)據(jù)裹赴。

例如:
在后臺設(shè)置響應(yīng)頭喜庞,同意http://a.com:8080源來請求數(shù)據(jù)
res.setHeader('Access-Control-Allow-Origin','http://a.com:8080')

a.com的請求頭會帶上自己的源
Origin: http://a.com:8080

如果匹配則可以共享資源

降域

當(dāng)兩個頁面不同域诀浪,但是它們的父域之上都相同(端口),那么可以使用降域的方法來實(shí)現(xiàn)跨域延都。
對于主域相同而子域不同的情況下雷猪,可以通過設(shè)置 document.domain 的辦法來解決。

document.domain = "jrg.com"

兩個頁面的域名后綴都要添加http://jrg.com晰房,把兩個網(wǎng)頁都降到同一個組域下求摇,這樣就可以訪問了。

postMessage

window.postMessage() 方法可以安全地實(shí)現(xiàn)跨源通信殊者。通常与境,對于兩個不同頁面的腳本,只有當(dāng)執(zhí)行它們的頁面位于具有相同的協(xié)議(通常為https)猖吴,端口號(443為https的默認(rèn)值)摔刁,以及主機(jī) (兩個頁面的模數(shù) Document.domain設(shè)置為相同的值) 時,這兩個腳本才能相互通信海蔽。
需要在全局的代碼中添加
window.frames[0].postMessage(this.value,'*');
而在需要訪問數(shù)據(jù)的網(wǎng)頁中用來監(jiān)聽postMessage

例如:

創(chuàng)建a.html

<div class="ct">
    <h1>使用postMessage實(shí)現(xiàn)跨域</h1>
    <div class="main">
        <input type="text" placeholder="http://a.jrg.com:8080/a.html">
    </div>

    <iframe src="http://localhost:8080/b.html" frameborder="0" ></iframe>

</div>


<script>
//URL: http://a.jrg.com:8080/a.html

$('.main input').addEventListener('input', function(){
    console.log(this.value);
    window.frames[0].postMessage(this.value,'*'); //* ,任何域下都可接受請求
})

window.addEventListener('message',function(e) {
        $('.main input').value = e.data
    console.log(e.data);
});



function $(id){
    return document.querySelector(id);
}

</script>

創(chuàng)建b.html

<input id="input" type="text"  placeholder="http://b.jrg.com:8080/b.html">
<script>

// URL: http://b.jrg.com:8080/b.html

$('#input').addEventListener('input', function(){
    window.parent.postMessage(this.value, '*');
})

window.addEventListener('message',function(e) {
        $('#input').value = e.data
    console.log(e.data);
});

function $(id){
    return document.querySelector(id);
}   

</script>






以上是我對跨域的理解共屈,有不足之處請多見諒

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市准潭,隨后出現(xiàn)的幾起案子趁俊,更是在濱河造成了極大的恐慌域仇,老刑警劉巖刑然,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暇务,居然都是意外死亡泼掠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門垦细,熙熙樓的掌柜王于貴愁眉苦臉地迎上來择镇,“玉大人,你說我怎么就攤上這事括改∧逋悖” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵嘱能,是天一觀的道長吝梅。 經(jīng)常有香客問我,道長惹骂,這世上最難降的妖魔是什么苏携? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮对粪,結(jié)果婚禮上右冻,老公的妹妹穿的比我還像新娘装蓬。我一直安慰自己,他們只是感情好纱扭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布牍帚。 她就那樣靜靜地躺著,像睡著了一般跪但。 火紅的嫁衣襯著肌膚如雪履羞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天屡久,我揣著相機(jī)與錄音忆首,去河邊找鬼。 笑死被环,一個胖子當(dāng)著我的面吹牛糙及,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筛欢,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼浸锨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了版姑?” 一聲冷哼從身側(cè)響起柱搜,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剥险,沒想到半個月后聪蘸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡表制,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年健爬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片么介。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡娜遵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壤短,到底是詐尸還是另有隱情设拟,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布久脯,位于F島的核電站纳胧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桶现。R本人自食惡果不足惜躲雅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骡和。 院中可真熱鬧相赁,春花似錦相寇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽询筏。三九已至剂府,卻和暖如春跨新,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛆挫。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工赃承, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悴侵。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓瞧剖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親可免。 傳聞我的和親對象是個殘疾皇子抓于,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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

  • 跨域有幾種常見的方式捉撮?你有沒有跨域使用的經(jīng)驗(yàn)? 方式: 使用jsonp實(shí)現(xiàn)跨域妇垢?使用cors實(shí)現(xiàn)跨域巾遭?瀏覽器另類的...
    饑人谷_遠(yuǎn)方閱讀 485評論 0 1
  • 一、同源策略(Same origin Policy) 瀏覽器出于安全方面的考慮修己,只允許與本域下的接口交互恢总。不同源的...
    5吖閱讀 808評論 0 0
  • 原文地址:原文地址 什么是跨域迎罗? 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源睬愤,這里跨域是廣義的。 廣義...
    C_Y大漁閱讀 1,258評論 1 13
  • 1纹安、 什么是同源策略 同源策略(Same Origin Policy)是一種約定尤辱,它是瀏覽器最核心也是最基本的安全...
    饑人谷_小敏閱讀 458評論 0 0
  • MBProgressHUD詳解(一) MBProgressHUD是一個顯示HUD窗口的第三方類庫,源碼點(diǎn)擊這里 ...
    凌巔閱讀 5,523評論 1 13