跨域問題

跨域問題

前言

近期回顧自己之前弄的思維導(dǎo)圖晦攒,這部分還可以再稍微細(xì)點(diǎn),寫點(diǎn)東西記錄下

原因

跨域問題問題產(chǎn)生的原因是由于同源策略得哆。
同源是指"協(xié)議+域名+端口"三者相同脯颜。
同源策略是瀏覽器的行為,是為了保護(hù)本地?cái)?shù)據(jù)不被JavaScript代碼獲取回來的數(shù)據(jù)污染贩据,因此攔截的是客戶端發(fā)出的請求回來的數(shù)據(jù)接收栋操,即請求發(fā)送了,服務(wù)器響應(yīng)了饱亮,但是無法被瀏覽器接收矾芙。

JSONP

因?yàn)閕mg,css,script等標(biāo)簽 不受同源策略影響,可以基于此策略近上,
利用script標(biāo)簽可以跨域的特點(diǎn)來發(fā)起跨域請求剔宪,后端返回一個(gè)函數(shù),前端調(diào)用此函數(shù)壹无,即完成的此次的請求

示例:

function jsonp() {
    var script = document.createElement('script');
    script.type = 'text/javascript';

    // 傳參并指定回調(diào)執(zhí)行函數(shù)為backFn
    script.src = 'http://localhost:8100/getUserInfo?uid=100&callback=backFn';
    document.head.appendChild(script);
}

// 回調(diào)執(zhí)行函數(shù)
function backFn(res) {
    alert(JSON.stringify(res));
}

document.getElementById('btn_get_data').addEventListener('click',()=>{
    jsonp();
});

JSONP方案可以兼容各種瀏覽器葱绒,但只支持get請求

CORS

2014年1月16號CORS作為http協(xié)議的擴(kuò)充部分正式發(fā)布,主要定義了客戶端和服務(wù)端的溝通機(jī)制斗锭,也就是所謂的協(xié)議地淀。
CORS需要瀏覽器和服務(wù)器同時(shí)支持。目前所有瀏覽器都支持該功能岖是,IE瀏覽器不能低于IE10帮毁。

瀏覽器將CORS請求分成兩類:

  • 簡單請求(simple request)
  • 非簡單請求(預(yù)檢請求)(not-so-simple request)她倘。

同時(shí)滿足以下兩大條件,就屬于簡單請求作箍,否則就是非簡單請求

(1) 請求方法是以下三種方法之一:

    HEAD
    GET
    POST
    
(2)HTTP請求頭信息不超出以下幾種字段:

    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三個(gè)值application/x-www-form-urlencoded硬梁、multipart/form-data、text/plain

簡單請求
對于簡單請求胞得,瀏覽器直接發(fā)出CORS請求荧止。具體來說,就是在頭信息之中阶剑,增加一個(gè)Origin字段跃巡。

非簡單請求
非簡單請求的CORS請求,會在正式通信之前牧愁,增加一次HTTP查詢請求素邪,稱為"預(yù)檢"請求(preflight)。

瀏覽器先詢問服務(wù)器猪半,當(dāng)前網(wǎng)頁所在的域名是否在服務(wù)器的許可名單之中兔朦,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復(fù)磨确,瀏覽器才會發(fā)出正式的XMLHttpRequest請求沽甥,否則就報(bào)錯。

PostMessage

postMessage是html5引入的API可以更方便乏奥、有效摆舟、安全的解決這些問題。postMessage()方法允許來自不同源的腳本采用異步方式進(jìn)行有限的通信邓了,可以實(shí)現(xiàn)跨文本檔恨诱、多窗口、跨域消息傳遞骗炉。

  • 頁面和其打開的新窗口的數(shù)據(jù)傳遞
  • 多窗口之間消息傳遞
  • 頁面與嵌套的iframe消息傳遞
  • 上面三個(gè)場景的跨域數(shù)據(jù)傳遞
postMessage(data,origin)方法接受兩個(gè)參數(shù)

data: html5規(guī)范支持任意基本類型或可復(fù)制的對象照宝,但部分瀏覽器只支持字符串,所以傳參時(shí)最好用JSON.stringify()序列化痕鳍。
  origin: 協(xié)議+主機(jī)+端口號硫豆,也可以設(shè)置為"*",表示可以傳遞給任意窗口笼呆,如果要指定和當(dāng)前窗口同源的話設(shè)置為"/"熊响。

Websocket

WebSocket 是 HTML5 開始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。

var Socket = new WebSocket(url, [protocol] );

第一個(gè)參數(shù) url, 指定連接的 URL诗赌。第二個(gè)參數(shù) protocol 是可選的汗茄,指定了可接受的子協(xié)議。
基本用法

// 初始化一個(gè) WebSocket 對象
var ws = new WebSocket("ws://localhost:9998/echo");

// 建立 web socket 連接成功觸發(fā)事件
ws.onopen = function () {
  // 使用 send() 方法發(fā)送數(shù)據(jù)
  ws.send("發(fā)送數(shù)據(jù)");
  alert("數(shù)據(jù)發(fā)送中...");
};

// 接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)事件
ws.onmessage = function (evt) {
  var received_msg = evt.data;
  alert("數(shù)據(jù)已接收...");
};

// 斷開 web socket 連接成功觸發(fā)事件
ws.onclose = function () {
  alert("連接已關(guān)閉...");
};

Cookie與iframe

如果兩個(gè)網(wǎng)頁一級域名相同铭若,二級域名不同洪碳,游覽器允許通過document.domain共享Cookie與iframe.

cookie的存儲大小偏小

iframe 缺點(diǎn):

1.會阻塞主頁面的onload事件
2.和主頁面共享連接池递览,而瀏覽器對相同域名的連接有限制,會影響頁面并行加載
3.不利于SEO

由于1和2問題瞳腌,最好通過js動態(tài)給iframe添加src屬性來避免1绞铃、2問題

參考

徹底理解CORS跨域原理
解決postMessage跨域問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫂侍,隨后出現(xiàn)的幾起案子儿捧,更是在濱河造成了極大的恐慌,老刑警劉巖挑宠,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菲盾,死亡現(xiàn)場離奇詭異,居然都是意外死亡各淀,警方通過查閱死者的電腦和手機(jī)懒鉴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碎浇,“玉大人临谱,你說我怎么就攤上這事∧衔妫” “怎么了吴裤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵旧找,是天一觀的道長溺健。 經(jīng)常有香客問我,道長钮蛛,這世上最難降的妖魔是什么鞭缭? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮魏颓,結(jié)果婚禮上岭辣,老公的妹妹穿的比我還像新娘。我一直安慰自己甸饱,他們只是感情好沦童,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叹话,像睡著了一般偷遗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驼壶,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天氏豌,我揣著相機(jī)與錄音,去河邊找鬼热凹。 笑死泵喘,一個(gè)胖子當(dāng)著我的面吹牛泪电,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纪铺,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼相速,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲜锚?” 一聲冷哼從身側(cè)響起和蚪,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烹棉,沒想到半個(gè)月后攒霹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浆洗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年催束,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伏社。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抠刺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摘昌,到底是詐尸還是另有隱情速妖,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布聪黎,位于F島的核電站罕容,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稿饰。R本人自食惡果不足惜锦秒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喉镰。 院中可真熱鬧旅择,春花似錦、人聲如沸侣姆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺宗。三九已至柱蟀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偿凭,已是汗流浹背产弹。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痰哨。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓胶果,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斤斧。 傳聞我的和親對象是個(gè)殘疾皇子早抠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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

  • 作者:Qyouu鏈接:https://www.imooc.com/article/70123來源:慕課網(wǎng) 本文對原...
    六個(gè)周閱讀 1,303評論 0 14
  • 瀏覽器在請求不同域的資源時(shí)蕊连,會因?yàn)橥床呗缘挠绊懻埱蟛怀晒Γ@就是通常被提到的“跨域問題”游昼。作為前端開發(fā)甘苍,解決跨域...
    SCQ000閱讀 2,539評論 1 52
  • 前端跨域問題的起因是什么—同源政策 1995年,同源政策由 Netscape 公司引入瀏覽器烘豌。目前载庭,所有瀏覽器都實(shí)...
    shaocx閱讀 1,464評論 1 6
  • 1. 什么是跨域? 跨域一詞從字面意思看廊佩,就是跨域名嘛囚聚,但實(shí)際上跨域的范圍絕對不止那么狹隘。具體概念如下:只要協(xié)議...
    他在發(fā)呆閱讀 822評論 0 0
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)标锄、焦點(diǎn)顽铸、注意力、語言聯(lián)想料皇、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析谓松,社會...
    Jenaral閱讀 5,701評論 0 5