在iframe中使用postMessage解決跨域問題

我們在前端頁面開發(fā)中猪钮,常常會用到iframe党饮。
而且我們在使用iframe的時候涂滴,大多數(shù)情況下不單單只是為了顯示頁面友酱,還要與父窗口進(jìn)行交互,這時候就出現(xiàn)了跨域問題柔纵,iframe頁面并不能直接操作父窗口的元素缔杉。
我們可以使用html5的postMessage()解決這個問題。

一搁料、什么是跨域

跨域或详,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本系羞。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制霸琴。所謂同源是指相同的域名椒振、協(xié)議和端口,只要其中一項不同就為跨域梧乘。
舉幾個例子:

  1. http://a.123.com/index.htmlhttp://a.123.com/index.js非跨域澎迎,它們有相同的域名,協(xié)議和端口选调。
  2. http://a.123.com/index.htmlhttp://b.123.com/index.js跨域夹供,相同的端口、協(xié)議学歧,但是域名不同(a.123.comb.123.com)罩引。
  3. http://a.123.com:8080/index.htmlhttp://a.123.com:8081/index.js跨域,相同的域名枝笨、協(xié)議袁铐,但是端口不同(8080和8081)。
  4. http://a.123.com/index.htmlhttps://a.123.com/index.js跨域跨域横浑,相同的域名剔桨、端口,但是協(xié)議不同(http和https)徙融。

二洒缀、postMessage()基本用法

【發(fā)送消息】

otherWindow.postMessage(message, targetOrigin, [transfer])
  • otherWindow
    其他窗口的一個引用,寫的是你要通信的window對象欺冀。
    例如在iframe中向父窗口傳遞數(shù)據(jù)時树绩,可以寫成window.parent.postMessage(),window.parent表示父窗口隐轩。
  • message
    需要傳遞的數(shù)據(jù)饺饭,字符串或者對象都可以。
  • targetOrigin
    表示目標(biāo)窗口的源职车,協(xié)議+域名+端口號瘫俊,如果設(shè)置為“*”,則表示可以傳遞給任意窗口悴灵。在發(fā)送消息的時候扛芽,如果目標(biāo)窗口的協(xié)議、域名或端口這三者的任意一項不匹配targetOrigin提供的值积瞒,那么消息就不會被發(fā)送川尖;只有三者完全匹配,消息才會被發(fā)送茫孔。例如:
window.parent.postMessage('hello world','http://a.123.com:8080/index.html')

只有父窗口是http://a.123.com:8080時才會接受到傳遞的消息庐船。

  • [transfer]
    可選參數(shù)银酬。是一串和message 同時傳遞的 Transferable 對象嘲更,這些對象的所有權(quán)將被轉(zhuǎn)移給消息的接收方,而發(fā)送一方將不再保有所有權(quán)揩瞪。我們一般很少用到赋朦。

【接收消息】

window.addEventListener('message', function (e) {
    console.log(e.data)  //e.data為傳遞過來的數(shù)據(jù)
    console.log(e.origin)  //e.origin為調(diào)用 postMessage 時消息發(fā)送方窗口的 origin(域名、協(xié)議和端口)
    console.log(e.source)  //e.source為對發(fā)送消息的窗口對象的引用李破,可以使用此來在具有不同origin的兩個窗口之間建立雙向通信
})

三宠哄、iframe與父窗口交互數(shù)據(jù)例子

iframe傳遞關(guān)閉命令

父窗口接收到命令將iframe關(guān)閉

四、安全問題

  1. 如果你不希望從其他網(wǎng)站接收message嗤攻,請不要為message事件添加任何事件監(jiān)聽毛嫉。
  2. 如果你確實希望從其他網(wǎng)站接收message,請始終使用origin和source屬性驗證發(fā)件人的身份妇菱。任何窗口都可以向任何其他窗口發(fā)送消息承粤,并且你不能保證未知發(fā)件人不會發(fā)送惡意消息。而且在驗證身份后闯团,你仍然應(yīng)該驗證接收到的消息的語法辛臊,防止非法攻擊(例如SQL注入)。
  3. 使用postMessage將數(shù)據(jù)發(fā)送到其他窗口時房交,應(yīng)該指定精確的目標(biāo)origin彻舰,而不是*。惡意網(wǎng)站可以在你不知情的情況下更改窗口的位置候味,因此它可以攔截使用postMessage發(fā)送的數(shù)據(jù)刃唤。

五、兼容性

  1. IE6白群,IE7不支持尚胞。
  2. IE8+雖然支持postMessage,但只支持iframe的方式川抡,window.open打開的新窗口之間辐真,沒法用。直到IE10才有相關(guān)改進(jìn)崖堤。

————
前端·小w
紙上學(xué)來終覺淺侍咱,絕知此事要躬行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市密幔,隨后出現(xiàn)的幾起案子楔脯,更是在濱河造成了極大的恐慌,老刑警劉巖胯甩,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昧廷,死亡現(xiàn)場離奇詭異堪嫂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)木柬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門皆串,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眉枕,你說我怎么就攤上這事恶复。” “怎么了速挑?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵谤牡,是天一觀的道長。 經(jīng)常有香客問我姥宝,道長翅萤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任腊满,我火速辦了婚禮套么,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糜烹。我一直安慰自己违诗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布疮蹦。 她就那樣靜靜地躺著诸迟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愕乎。 梳的紋絲不亂的頭發(fā)上阵苇,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音感论,去河邊找鬼绅项。 笑死,一個胖子當(dāng)著我的面吹牛比肄,可吹牛的內(nèi)容都是我干的快耿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼芳绩,長吁一口氣:“原來是場噩夢啊……” “哼掀亥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妥色,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤搪花,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撮竿,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡吮便,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幢踏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片髓需。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惑折,靈堂內(nèi)的尸體忽然破棺而出授账,到底是詐尸還是另有隱情,我是刑警寧澤惨驶,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站敛助,受9級特大地震影響粗卜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纳击,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一续扔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焕数,春花似錦纱昧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至善已,卻和暖如春灼捂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背换团。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工悉稠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艘包。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓的猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親想虎。 傳聞我的和親對象是個殘疾皇子卦尊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353