前后端通信的那些事兒

一屋讶、同源策略

同源就是當(dāng)協(xié)議、域名和端口都一致時须教,才算是同源皿渗,有一個不同都不是同源。

同源策略官方解釋就是轻腺,限制從一個源加載的文檔或腳本如何與來自另一個源的資源進(jìn)行交互羹奉。這是一個用戶隔離潛在惡意文件的關(guān)鍵的安全機(jī)制。

不是同源约计,主要會有以下限制:

  • cookie、LocalStorage和IndexDB無法讀取
  • DOM無法獲取
  • Ajax請求不能發(fā)送

二迁筛、前后端如何通信

  • Ajax 煤蚌,受同源策略限制
  • WebSocket耕挨,不受同源策略限制
  • CORS,既支持跨域通信尉桩,也支持同源通信

三筒占、如何創(chuàng)建Ajax

創(chuàng)建一個Ajax,主要考慮如下問題:

  • XMLHttpRequest 對象的工作流程
  • 兼容性的處理
  • 事件的觸發(fā)條件
  • 事件的觸發(fā)順序
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc()
{
  var xmlhttp;
  var txt,x,i;
// 判斷XMLHttpRequest是否存在
  if (window.XMLHttpRequest)
  {
    // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執(zhí)行代碼
    xmlhttp=new XMLHttpRequest();
  }
  else
  {
    // IE6, IE5 瀏覽器執(zhí)行代碼
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function()
  {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      xmlDoc=xmlhttp.responseXML;
      txt="";
      x=xmlDoc.getElementsByTagName("ARTIST");
      for (i=0;i<x.length;i++)
      {
        txt=txt + x[i].childNodes[0].nodeValue + "<br>";
      }
      document.getElementById("myDiv").innerHTML=txt;
    }
  }
  xmlhttp.open("GET","cd_catalog.xml",true);
  xmlhttp.send();
}
</script>
</head>
<body>

<h2>我收藏的 CD :</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">獲取我的 CD</button>
 
</body>
</html>

創(chuàng)建一個Ajax的基本步驟:

  • (1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象蜘犁。
  • (2)創(chuàng)建一個新的HTTP請求,并指定請求的方法翰苫、URL、是否異步處理請求及驗(yàn)證信息这橙。
  • (3)為onreadystatechange 事件綁定方法奏窑,監(jiān)聽狀態(tài)的改變。
  • (4)發(fā)送HTTP請求屈扎。

四埃唯、跨域通信的幾種方式

  • JSONP
    只支持GET請求
    利用script標(biāo)簽支持跨域的屬性,用script標(biāo)簽?zāi)玫桨藬?shù)據(jù)的方法(相當(dāng)于是返回了一段js代碼)鹰晨,在請求中包含callback墨叛,服務(wù)端注入?yún)?shù)后返回這個回調(diào)函數(shù),然后script標(biāo)簽?zāi)玫椒祷氐膉s代碼跨域直接運(yùn)行回調(diào)模蜡,需要前后端的配合漠趁。
  • Hash
    原理是利用location.hash來進(jìn)行傳值。在url: http://a.com#helloword中的‘#helloworld’就是location.hash忍疾,改變hash并不會導(dǎo)致頁面刷新闯传,所以可以利用hash值來進(jìn)行數(shù)據(jù)傳遞,當(dāng)然傳遞數(shù)據(jù)的大小是有限的膝昆。
  • postMessage
// 窗口A(http://A.com)向跨域窗口B(http://B.com)發(fā)送信息
window.postMessage('data', 'http://B.com');

// 在窗口B中監(jiān)聽
window.addEventListener('message', function(event){
     console.log(event.origin); // http://A.com
     console.log(event.source); // A的window
     console.log(event.data); // data
})
  • WebSocket
    特點(diǎn)包括:

(1)建立在 TCP 協(xié)議之上丸边,服務(wù)器端的實(shí)現(xiàn)比較容易。
(2)與 HTTP 協(xié)議有著良好的兼容性荚孵。默認(rèn)端口也是80和443妹窖,并且握手階段采用 HTTP 協(xié)議,因此握手時不容易屏蔽收叶,能通過各種 HTTP 代理服務(wù)器骄呼。
(3)數(shù)據(jù)格式比較輕量,性能開銷小判没,通信高效蜓萄。
(4)可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)澄峰。
(5)沒有同源限制嫉沽,客戶端可以與任意服務(wù)器通信。
(6)協(xié)議標(biāo)識符是ws(如果加密俏竞,則為wss)绸硕,服務(wù)器網(wǎng)址就是 URL堂竟。

var ws = new Websocket('wss://echo.websocket.org');

ws.onopen = function(evt) {
    console.log('Connection open...');
    ws.send('Hello world!');
};

ws.onmessage = function (evt) {
    console.log('Received Message' + evt.data);
    ws.close();
};

ws.onclose = function (evt) {
    console.log('Connection closed');
}

  • CORS
    為什么CORS能支持跨域通信?
    瀏覽器會攔截Ajax請求玻佩,如果瀏覽器發(fā)現(xiàn)這個Ajax請求時跨域的出嘹,它會在HTTP請求頭中加一個origin。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咬崔,一起剝皮案震驚了整個濱河市税稼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垮斯,老刑警劉巖郎仆,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甚脉,居然都是意外死亡丸升,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門牺氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡耻,“玉大人,你說我怎么就攤上這事猴凹∫恼” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵郊霎,是天一觀的道長沼头。 經(jīng)常有香客問我,道長书劝,這世上最難降的妖魔是什么进倍? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮购对,結(jié)果婚禮上猾昆,老公的妹妹穿的比我還像新娘。我一直安慰自己骡苞,他們只是感情好垂蜗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著解幽,像睡著了一般贴见。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躲株,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天片部,我揣著相機(jī)與錄音,去河邊找鬼霜定。 笑死档悠,一個胖子當(dāng)著我的面吹牛捆探,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播站粟,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曾雕!你這毒婦竟也來了奴烙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剖张,失蹤者是張志新(化名)和其女友劉穎切诀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搔弄,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幅虑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了顾犹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倒庵。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炫刷,靈堂內(nèi)的尸體忽然破棺而出擎宝,到底是詐尸還是另有隱情,我是刑警寧澤浑玛,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布绍申,位于F島的核電站,受9級特大地震影響顾彰,放射性物質(zhì)發(fā)生泄漏极阅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一涨享、第九天 我趴在偏房一處隱蔽的房頂上張望筋搏。 院中可真熱鬧,春花似錦灰伟、人聲如沸拆又。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帖族。三九已至,卻和暖如春挡爵,著一層夾襖步出監(jiān)牢的瞬間竖般,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工茶鹃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涣雕,地道東北人艰亮。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像挣郭,于是被迫代替她去往敵國和親迄埃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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