前后端分離 跨域

前提提示:最近的項(xiàng)目中,采用了前后端分離的開發(fā)模式。前端通過fetch api訪問后端rest api谢肾。其間很自然的就會(huì)出現(xiàn)跨域問題。

什么是跨域钦铺?

以下是腦補(bǔ)之后的一些理解订雾。

CORS(Cross-origin request sharing)跨域資源共享,是一個(gè)w3c標(biāo)準(zhǔn)矛洞,它允許你向一個(gè)不同源服務(wù)發(fā)出XMLHttpRequest請(qǐng)求洼哎,從而克服ajax只能請(qǐng)求同源服務(wù)的限制。

瀏覽器出于安全考慮沼本,實(shí)施的一種同源策略,對(duì)非同源訪問會(huì)主動(dòng)攔截掉噩峦。

同源是指具有相同的:url協(xié)議(eg:http,https)、域名(eg:google.com)抽兆、端口

在瀏覽器中识补,script、img郊丛、iframe李请、link(這些標(biāo)簽似乎都有src屬性)等標(biāo)簽可以加載跨域資源,而不受同源限制厉熟。

那么如何處理跨域的請(qǐng)求呢导盅?目前比較多做法是jsonp,nginx反向代理揍瑟,cors本文主要介紹cors.

jsonp:通過可以跨域的script標(biāo)簽白翻,這樣請(qǐng)求就能跨域訪問了,通過約定好回調(diào)绢片,就能獲得相關(guān)響應(yīng)數(shù)據(jù)滤馍。缺點(diǎn)是只支持GET不支持POST等其它類型請(qǐng)求;

nginx代理:通過一個(gè)代理服務(wù)器,轉(zhuǎn)發(fā)請(qǐng)求到后端服務(wù)底循。缺點(diǎn)是擴(kuò)展性不好巢株。開發(fā),測(cè)試,預(yù)發(fā)布等幾個(gè)環(huán)境切換都需要配置。

cors: 支持所有類型的http請(qǐng)求熙涤,在服務(wù)端設(shè)置即可阁苞。缺點(diǎn)是老的瀏覽器不兼容(IE6,7,8 沒關(guān)系,這些老版本不要管了)

CORS基本過程:

在HttpServertResponse響應(yīng)中添加響應(yīng)頭:

Access-Control-Allow-Origin:(必設(shè))添加瀏覽器允許的域名,可設(shè)置*表示任何祠挫。(origin是你瀏覽器上的地址組成的)

Access-Control-Allow-Credentials:(可設(shè))是否允許發(fā)送cookie那槽。如果設(shè)置為true,客戶端請(qǐng)求也要將withCredentials設(shè)為true;

Access-Control-Request-Method: 必須的,表示CORS上會(huì)使用到那些HTTP方法;

Access-Control-Request-Headers: 必須的,表示CORS上會(huì)有那些額外的的有信息;

SpringBoot支持cors

SpringBoot中已經(jīng)很好的支持了cors

CorsFilter類提供了改功能,通過構(gòu)造UrlBasedCorsConfigurationSource類相關(guān)配置

以下是基本的代碼:

@Configuration

public classCorsConfig {

private CorsConfiguration buildConfig(){

CorsConfiguration corsConfiguration =newCorsConfiguration();

corsConfiguration.addAllowedOrigin("*");//允許任何域名

corsConfiguration.addAllowedHeader("*");//允許任何頭

corsConfiguration.addAllowedMethod("*");//允許任何方法get,post..

returncorsConfiguration;

}

@Bean

public CorsFiltercors Filter(){

UrlBasedCorsConfigurationSource source =new UrlBasedCorsConfigurationSource();

source.registerCorsConfiguration("/**",buildConfig());

return newCorsFilter(source);

}}

至此等舔,一個(gè)接受任何域的跨域請(qǐng)求就ok了骚灸。

跨域共享cookie

但是還未結(jié)束,對(duì)于權(quán)限驗(yàn)證慌植,目前還是使用的基于session,cookie的驗(yàn)證甚牲,所以這種方案需要實(shí)現(xiàn)跨域共享cookie.(強(qiáng)烈不建議使用cookie)义郑,那么對(duì)于客戶端的請(qǐng)求就需要額外加上幾個(gè)參數(shù)。

對(duì)于跨域共享cookie丈钙,需要注意的是后端響應(yīng)的response head里的 Access-Control-Allow-Origin不能是通配符魔慷,且不能配置多個(gè),Access-Control-Allow-Credentials需要設(shè)置為true

對(duì)于Access-Control-Allow-Origin的限制著恩,只能指定單一域名或使用req.getHeader("Origin")來獲取每次請(qǐng)求的Origin院尔。這樣一來,你要另外寫一個(gè)Filter喉誊。

客戶端的設(shè)置:以jQuery為例需要在里面加入xhrFields: {withCredentials: true},crossDomain: true?

在這些修改做好后邀摆,訪問后端接口,但是依然不能解決伍茄。排查了半天栋盹,是跨域請(qǐng)求之前都要執(zhí)行一個(gè)OPTIONS請(qǐng)求,這個(gè)請(qǐng)求是一個(gè)預(yù)檢測(cè)的服務(wù)敷矫,用于獲知服務(wù)端能接受哪些請(qǐng)求方法例获,origin等信息。后端會(huì)在響應(yīng)中返回一個(gè)cookie曹仗,在下一次請(qǐng)求時(shí)會(huì)帶上這個(gè)cookie榨汤。就實(shí)現(xiàn)了基本的跨域cookie共享,后端也能正常獲取到session怎茫。

這個(gè)請(qǐng)求可以特殊處理收壕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轨蛤,隨后出現(xiàn)的幾起案子蜜宪,更是在濱河造成了極大的恐慌,老刑警劉巖祥山,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃验,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缝呕,警方通過查閱死者的電腦和手機(jī)澳窑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岳颇,“玉大人照捡,你說我怎么就攤上這事颅湘』安啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵闯参,是天一觀的道長瞻鹏。 經(jīng)常有香客問我悲立,道長,這世上最難降的妖魔是什么新博? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任薪夕,我火速辦了婚禮,結(jié)果婚禮上赫悄,老公的妹妹穿的比我還像新娘原献。我一直安慰自己,他們只是感情好埂淮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布姑隅。 她就那樣靜靜地躺著,像睡著了一般倔撞。 火紅的嫁衣襯著肌膚如雪讲仰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天痪蝇,我揣著相機(jī)與錄音鄙陡,去河邊找鬼。 笑死躏啰,一個(gè)胖子當(dāng)著我的面吹牛趁矾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播给僵,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愈魏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了想际?” 一聲冷哼從身側(cè)響起培漏,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胡本,沒想到半個(gè)月后牌柄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侧甫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年珊佣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片披粟。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咒锻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出守屉,到底是詐尸還是另有隱情惑艇,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滨巴,受9級(jí)特大地震影響思灌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恭取,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一泰偿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜈垮,春花似錦耗跛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晨继,卻和暖如春烟阐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紊扬。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蜒茄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人餐屎。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓檀葛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腹缩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屿聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 歡迎關(guān)注微信公眾號(hào):全棧工廠 本文主要參考跨域資源共享 CORS 詳解[http://www.ruanyifeng...
    liqingbiubiu閱讀 1,844評(píng)論 0 3
  • 前言:對(duì)于跨域請(qǐng)求,很早之前就有去了解過藏鹊,但因?yàn)橐恢标P(guān)注的都是服務(wù)器后端開發(fā)润讥,故也就僅僅停留在概念的理解上而沒有機(jī)...
    ken_ljq閱讀 89,764評(píng)論 6 128
  • CORS是一個(gè)W3C標(biāo)準(zhǔn),全稱是"跨域資源共享"(Cross-origin resource sharing)盘寡。 ...
    奇特思維家閱讀 1,121評(píng)論 0 3
  • 我本來準(zhǔn)備好了一個(gè)小號(hào)楚殿,還給自己起了集卡哇伊酷炫于一身的微信名。但是8吞怠4嘀唷!基于種種考慮我還是用自己的私人專屬號(hào)...
    MMYZ_K閱讀 433評(píng)論 5 4
  • 目的 你有沒有被一個(gè)尷尬的問題困擾過影涉,在微信中瀏覽商品列表的時(shí)候滑到了一個(gè)中間的位置变隔,點(diǎn)擊了某一個(gè)詳情,可是從詳情...
    fourn熊能閱讀 2,901評(píng)論 0 50