前端的跨域問題

? ? 跨域:只要協(xié)議疲牵、域名承二、端口有任何一個不同,都被當(dāng)作是不同的域纲爸;

? ??前端碰上跨域的問題應(yīng)該算是十分常見亥鸠,比如地址映射,訪問外部網(wǎng)路接口等等识啦,而且面試中常常會問到這個负蚊,所以做下總結(jié):

1、瀏覽器有一個同源策略颓哮,其一是不能通過ajax的方法去請求不同源中的文檔家妆。其二是瀏覽器中不同域的框架之間是不能進行js的交互操作的。不同的框架之間是可以獲取window對象的冕茅,但卻無法獲取相應(yīng)的屬性和方法伤极;

理解:不同域的文檔以及js,你可以獲取這個對象姨伤,但是你無法確定對象中的元素以及方法

解決:

document.domain跨域 - iframe :

在當(dāng)前頁(a.xxx.com)的js與iframe(b.xxx.com)的js中用document.domain設(shè)置同一個域名(xxx.com)哨坪,這樣兩個頁面就屬于同樣一個域名下,可以進行相互調(diào)用

缺點:兩個域名必須屬于同一個基礎(chǔ)域名姜挺,而且所用的協(xié)議齿税,端口都要一致彼硫,否則無法利用document.domain進行跨域

2炊豪、hash:?URL有一部分被稱為hash(就是#號及其后面的字符)-瀏覽器錨點定位凌箕,修改這個部分會產(chǎn)生瀏覽器歷史記錄,但是不影響請求發(fā)送

location.hash跨域 -?iframe:

(1)父傳子:

? ? 修改iframe中src的#后綴词渤,在iframe中監(jiān)聽#后綴變化獲取

(2)子傳父:

? ? 在iframe中新增一個iframe牵舱,域名為父級的域名,然后通過parent修改#后綴:

? ??parent.parent.location.hash = self.location.hash.substring(1)

缺點:數(shù)據(jù)直接暴露在了url中缺虐;數(shù)據(jù)容量和類型都有限

注意:IE芜壁、chrome的安全機制無法修改parent.location.hash,需要parent.location.hash = 'data'來try catch判斷是否可以執(zhí)行

3高氮、postMessage跨域:

使用方法:

父級使用: otherWindow.postMessage(message, targetOrigin);

iframe.contentWindow.postMessage('xxx', 路徑)

otherWindow:指目標(biāo)窗口慧妄,也就是給哪個window發(fā)消息,是 window.frames 屬性的成員或者由 window.open 方法創(chuàng)建的窗口

message:? 是要發(fā)送的消息剪芍,類型為 String塞淹、Object (IE8、9 不支持)

targetOrigin:? 是限定消息接收范圍


子級使用:window.addEventListener(“message”, function(event){})

event.data : 是傳遞過來的數(shù)據(jù)

event.origin :?是調(diào)用postMessage方法的窗口的源URL(包括協(xié)議罪裹、域名饱普、端口號)

event.source :?是發(fā)送消息的窗口對象

注意:要確定iframe創(chuàng)建完畢后加入監(jiān)聽,否則可能監(jiān)聽不到傳遞的信息状共;如果iframe中的同源頁面需要使用可以在子頁面中把數(shù)據(jù)存入緩存

4套耕、jsonp跨域:

適用:單純獲取不同源網(wǎng)頁的數(shù)據(jù)

<script src="xxx?callback=方法名"></script>

如上,jsonp時通過script導(dǎo)入時的回調(diào)函數(shù)進行數(shù)據(jù)獲取的

$.getJSON('xxx?callback=?,function(jsondata)'){

? ? ? ? //處理獲得的json數(shù)據(jù)

?})

query會自動生成一個全局函數(shù)來替換callback=?中的問號峡继,之后獲取到數(shù)據(jù)后又會自動銷毀-實際上就是起一個臨時代理函數(shù)的作用

$.getJSON方法會自動判斷是否跨域冯袍,不跨域的話,就調(diào)用普通的ajax方法碾牌;跨域的話颠猴,則會以異步加載js文件的形式來調(diào)用jsonp的回調(diào)函數(shù)

$.ajax({

? url: 'xxx',

? type: 'get',

? dataType: 'jsonp', // 請求方式為jsonp

? jsonpCallback: "回調(diào)函數(shù)",// 自定義回調(diào)函數(shù)名??

? data: {}

})

優(yōu)點:它不像XMLHttpRequest對象實現(xiàn)的Ajax請求那樣受到同源策略的限制;它的兼容性更好小染,在更加古老的瀏覽器中都可以運行翘瓮,不需要XMLHttpRequest或ActiveX的支持;并且在請求完畢后可以通過調(diào)用callback的方式回傳結(jié)果

缺點:它只支持GET請求而不支持POST等其它類型的HTTP請求裤翩;它只支持跨域HTTP請求這種情況资盅,不能解決不同域的兩個頁面之間如何進行JavaScript調(diào)用的問題

5、cros跨域

cros跨域的實現(xiàn)主要時依靠后端實現(xiàn)踊赠,前端只要調(diào)用方法即可呵扛,不多做介紹

6、window.name跨域

window.name:?

????在一個窗口(window)的生命周期內(nèi),窗口載入的所有的頁面都是共享一個window.name的筐带;

????每個頁面對window.name都有讀寫的權(quán)限今穿;

????window.name是持久存在一個窗口載入過的所有頁面中的,并不會因新頁面的載入而進行重置伦籍;

????可以存儲不超過2M的數(shù)據(jù)蓝晒,只能是String格式的數(shù)據(jù)

與document.domain類似腮出,window.name的跨域需要使用一個中間iframe:

var iframe = document.getElementById('iframe');

????iframe.onload = function () {

????var window = iframe .contentWindow;

????console.log(window.name);

?}

iframe.src = '同源地址'

與 document.domain 方法相比,window.name放寬了域名后綴要相同的限制芝薇,可以從任意頁面獲取 string 類型的數(shù)據(jù)

7胚嘲、Vue中的proxy跨域(常用):

現(xiàn)在Vue項目下通常都會有vue.config.js文件作為項目的配置用,如果沒有可以在根目錄下新建洛二,會自動讀炔雠;

通過配置proxy就可以成功跨域:

devServer: {

? ? proxy: {? // 配置跨域

????'/api': {

? ? ? ? target: 'xxxx',// 真實接口

? ? ? ? changOrigin:true,// 允許跨域? ? ? ??

? ? ? ? pathRewrite: {i

? ? ? ? ? '^/api': ''

? ? ? ? }

? ? ? },

????}

?},

通過配置晾嘶,真實的路徑會被掩蓋妓雾,瀏覽器訪問的地址將會被重寫成真正的路徑,安全性較高

注意: 是否形成跨域垒迂,在前端的判斷是根據(jù)URL的路徑(window.location.protocol + window.location.hos)判斷的君珠,頭部的域就是判斷的標(biāo)準(zhǔn);

如果是協(xié)議和端口造成的跨域問題“前臺”是無能為力的娇斑;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末策添,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子毫缆,更是在濱河造成了極大的恐慌唯竹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苦丁,死亡現(xiàn)場離奇詭異浸颓,居然都是意外死亡,警方通過查閱死者的電腦和手機旺拉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門产上,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛾狗,你說我怎么就攤上這事晋涣。” “怎么了沉桌?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵谢鹊,是天一觀的道長。 經(jīng)常有香客問我留凭,道長佃扼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任蔼夜,我火速辦了婚禮兼耀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己瘤运,他們只是感情好窍霞,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尽超,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梧躺。 梳的紋絲不亂的頭發(fā)上似谁,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音掠哥,去河邊找鬼巩踏。 笑死,一個胖子當(dāng)著我的面吹牛续搀,可吹牛的內(nèi)容都是我干的塞琼。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼禁舷,長吁一口氣:“原來是場噩夢啊……” “哼彪杉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牵咙,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤派近,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洁桌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渴丸,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年另凌,在試婚紗的時候發(fā)現(xiàn)自己被綠了谱轨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吠谢,死狀恐怖土童,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情工坊,我是刑警寧澤娜扇,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站栅组,受9級特大地震影響雀瓢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玉掸,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一刃麸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧司浪,春花似錦泊业、人聲如沸把沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饮睬。三九已至,卻和暖如春篮奄,著一層夾襖步出監(jiān)牢的瞬間捆愁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工窟却, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昼丑,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓夸赫,卻偏偏與公主長得像菩帝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茬腿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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