[HTTP趣談]支持跨域及相關(guān)cookie設(shè)置

如今“前后端分離”的設(shè)計(jì)思想已經(jīng)非常普及耳奕,所以一旦靜態(tài)資源和后臺(tái)應(yīng)用部署在不同服務(wù)器上并采用不同域名,那么,必然會(huì)遇到“瀏覽器同源策略”的限制身辨,也必然丐谋,需要前后臺(tái)一起合作解決跨域問題。

1. 同源策略

什么樣的URL是同源的煌珊?其必須滿足下面三個(gè)條件:

  • 協(xié)議號(hào)相同
  • 域名相同
  • 端口相同

比如号俐,a.com網(wǎng)站,想要訪問b.com網(wǎng)站api定庵,比如api.b.com吏饿。那么,在“同源策略”限制下蔬浙,a.com網(wǎng)站無法獲取api.b.com下的cookie猪落,也無法向api.b.com發(fā)送ajax請(qǐng)求。

2. 如何支持跨域

最簡(jiǎn)單的方式是后臺(tái)服務(wù)器將允許跨域訪問的URL添加到白名單中畴博,這樣许布,前臺(tái)應(yīng)用不需要做任何特殊處理。

另外绎晃,還有兩種常用方法:

1) JSONP

基本思想為:網(wǎng)頁(yè)通過添加一個(gè)<script>元素蜜唾,向服務(wù)器請(qǐng)求JSON數(shù)據(jù),服務(wù)器收到請(qǐng)求后庶艾,將數(shù)據(jù)放在一個(gè)指定名字的回調(diào)函數(shù)里傳回來袁余。
用src屬性請(qǐng)求資源的標(biāo)簽,比如<link>咱揍,<img>颖榜,<script>...都不受同源策略的限制。

<body>
<button onclick="loadData()">LoadData</button>
<script>
    function foo(res){
        console.log(res)
    }

    function loadData(){
        var elem = document.createElement('script');
        elem.src = 'http://a.com/jsonp?callback=foo';
        document.head.appendChild(elem);
    }
</script>
</body>

用JSONP煤裙,瀏覽器會(huì)自動(dòng)在request header里面帶上a.com下的cookie信息掩完。
其實(shí),通過src調(diào)用api都是GET方式硼砰,類似請(qǐng)求資源文件且蓬,必須明確,從Web頁(yè)面產(chǎn)生的文件請(qǐng)求都會(huì)帶上cookie题翰。

因此恶阴,JSONP的缺點(diǎn)很明顯了:

  • 只支持GET請(qǐng)求
  • 只能帶本域下的cookies
2) CORS(Cross-origin resource sharing)

CORS是一個(gè)W3C標(biāo)準(zhǔn),全稱是"跨域資源共享"豹障。它運(yùn)行瀏覽器向跨域服務(wù)器發(fā)送AJAX請(qǐng)求冯事。

小貼士

IE10以上用XMLHttpRequest對(duì)象實(shí)現(xiàn)CORS;
IE8血公,IE9用XDomainRequest支持CORS昵仅。

整個(gè)CORS跨域,是瀏覽器自動(dòng)完成累魔,不需要前端特殊處理摔笤。瀏覽器一旦發(fā)現(xiàn)是AJAX請(qǐng)求跨域够滑,會(huì)添加origin頭信息,后臺(tái)應(yīng)用需要根據(jù)request header中的origin/referer籍茧,來設(shè)置正確的response header版述,完成跨域請(qǐng)求梯澜。

cors.png

CORS具體的概念和講解寞冯,網(wǎng)上很多資料,包括什么是簡(jiǎn)單請(qǐng)求和“Preflighted”晚伙,請(qǐng)參考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS吮龄。

下面要重點(diǎn)提到的是,CORS下咆疗,前端如何攜帶cookies?

Requests with credentials

用JS/JQuery啟動(dòng)AJAX請(qǐng)求時(shí)漓帚,必須設(shè)置withCredentials頭為true,寫法如下:

JS:
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open('POST', ‘a(chǎn).com’, true);
xhr.send();

JQuery:
$.ajax({
  url: a_cross_domain_url,
  xhrFields: {
    withCredentials: true
  }
});

這時(shí)午磁,后臺(tái)設(shè)置response header時(shí)尝抖,需要返回:

Access-Control-Allow-Credentials: true;
Access-Control-Allow-Origin: a.com; //必須為具體域名,不能是*

重點(diǎn)需要注意的是cookies信息Q富省C亮伞!這時(shí)登颓,request請(qǐng)求中可以攜帶的cookies搅荞,不僅僅有本域下的cookies,還包括跨域服務(wù)器下設(shè)置的cookies(注意:跨域服務(wù)器下的cookies框咙,是無法通過JS代碼document.cookie訪問咕痛,該cookies只能被遠(yuǎn)程服務(wù)器控制)。

可見喇嘱,在安全性上茉贡,CORS比JSONP強(qiáng)悍很多!

CORS缺點(diǎn)是者铜,低版本的IE瀏覽器支持不好块仆。

3. 小結(jié)

針對(duì)iframe,還有些特殊的解決跨域方式王暗,比如HTML5新特性:postMessage悔据。
如果父子窗口是同一個(gè)主域,不同子域俗壹,也可以通過設(shè)置document.domain屬性科汗,規(guī)避同源策略。

微信公眾號(hào):

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绷雏,一起剝皮案震驚了整個(gè)濱河市头滔,隨后出現(xiàn)的幾起案子怖亭,更是在濱河造成了極大的恐慌,老刑警劉巖坤检,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兴猩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡早歇,警方通過查閱死者的電腦和手機(jī)倾芝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箭跳,“玉大人晨另,你說我怎么就攤上這事∑仔眨” “怎么了借尿?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屉来。 經(jīng)常有香客問我路翻,道長(zhǎng),這世上最難降的妖魔是什么茄靠? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任茂契,我火速辦了婚禮,結(jié)果婚禮上嘹黔,老公的妹妹穿的比我還像新娘账嚎。我一直安慰自己,他們只是感情好儡蔓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布郭蕉。 她就那樣靜靜地躺著,像睡著了一般喂江。 火紅的嫁衣襯著肌膚如雪召锈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天获询,我揣著相機(jī)與錄音涨岁,去河邊找鬼。 笑死吉嚣,一個(gè)胖子當(dāng)著我的面吹牛梢薪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尝哆,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼秉撇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琐馆,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤规阀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瘦麸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谁撼,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年滋饲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厉碟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡了赌,死狀恐怖墨榄,靈堂內(nèi)的尸體忽然破棺而出玄糟,到底是詐尸還是另有隱情勿她,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布阵翎,位于F島的核電站逢并,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏郭卫。R本人自食惡果不足惜砍聊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贰军。 院中可真熱鬧玻蝌,春花似錦、人聲如沸词疼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贰盗。三九已至许饿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舵盈,已是汗流浹背陋率。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秽晚,地道東北人瓦糟。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赴蝇,于是被迫代替她去往敵國(guó)和親菩浙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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