記一次瀏覽器預檢請求跨域問題的踩坑

通用的跨域處理方案

如果你是一枚前端工程師术吝,我想應該或多或少對瀏覽器跨域請求有一些了解转捕。

跨域的詳細知識园细,就不再這篇文章里贅述了。

不太了解或者有興趣了解一下的童鞋可以參考下 mdn 上的這篇文章:Cross-Origin Resource Sharing (CORS) - HTTP | MDN昔馋。

文章內(nèi)容寫的很詳盡筹吐,相信你看完以后,一定會有種恍然大悟的感覺秘遏。

既然這篇文章丘薛,是想要記錄下踩坑的歷程,接下來肯定得詳細記錄下邦危,坑出現(xiàn)在哪兒了洋侨。

一般情況下,出現(xiàn)需要跨域請求之時倦蚪,對于要求不高的地方希坚,直接改下 web 服務器的配置,允許所有的跨域請求即可陵且,這也是最隨意的做法裁僧。

簡而言之,也就是直接朝響應頭里添加 Access-Control-Allow-Origin: * 參數(shù),代表能正常響應所有的跨域請求聊疲。

不過就像我前面所說的那樣茬底,之所以說隨意,是因為获洲,允許所有的跨域請求阱表,是一種不太安全的行為,任何網(wǎng)站都可以隨意的使用你提供的 web 服務贡珊。

甚至于最爬,會讓自己網(wǎng)站陷入跨域攻擊的危險之中。

當然飞崖,如果你本身就想要提供公開的數(shù)據(jù)烂叔、業(yè)務接口,那么就可以直接采用上面那種簡單粗暴的方式固歪。

但是,如果不是出于上述目的的話京痢,那么則不建議直接采用上面省事兒的方式拱撵。

一般我們可以采用增加白名單的方式参咙,也就是只允許目標網(wǎng)站的請求,能夠正常的響應:Access-Control-Allow-Origin: https://foo.example

復雜請求導致之前的跨域配置失效

而我們在實際應用的過程中蒲讯,出于安全性考慮,一般都是由后端童鞋直接在 nginx 上統(tǒng)一進行跨域的配置灰署,當然判帮,肯定是采用第二種方式。

之前的項目采用這種配置方式溉箕,沒有任何的問題晦墙。

但是最近做的一個項目,對于用戶權限這一塊肴茄,我們采用 token 的方式來處理晌畅,為了方便起見,直接將 Authorization 字段配置在請求頭里了寡痰,方便對 api 請求進行權限控制抗楔。

但是在本地調(diào)試的時候,發(fā)現(xiàn)出現(xiàn)了跨域問題拦坠,接口死活調(diào)不通连躏。

image.png

這個時候,可能有童鞋就要問了贞滨,現(xiàn)在不一般用 webpack 打包入热,在 webpack 的 devserver 里配置一下 proxy 模式不就行了。

起初碰到這個問題的時候,我也打算采用這個方式來解決才顿,因為按照以往的經(jīng)驗來說莫湘,webpack devserver 相當于是起了一個 express 服務器,用它直接代理下我們的請求郑气,就能避免前端跨域問題了幅垮。

但是不知道后端童鞋提供的 web 服務做了什么限制,走 express 代理的話尾组,請求死活要過一分鐘才會姍姍來遲的響應忙芒,與后端童鞋溝通過,無果讳侨,沒找到解決方案呵萨,遂放棄了這種方式。

既然 express 代理的方式不可行跨跨,那就只能硬著頭皮研究一下潮峦,為何明明配置了跨域,還是會提示跨域勇婴,死活調(diào)不通接口呢忱嘹。

在找問題的過程中,我一度陷入了自我懷疑了耕渴。

為了確認不是前端代碼層面的問題拘悦,確實是跨域?qū)е碌膯栴}。我將項目打包以后朝服務器部署了一份橱脸,在非跨域的時候訪問础米,果然一切正常,接口能正常請求到數(shù)據(jù)了添诉。

這說明屁桑,確實是跨域引起的問題,正如 chrome 的 devtools 提示的那樣吻商。

這時候掏颊,我靈機一動,為啥我不換個瀏覽器試試呢艾帐?

于是我用 firefox 測試乌叶,嘗試重新調(diào)用后臺接口請求數(shù)據(jù),才終于發(fā)現(xiàn)問題所在柒爸。


image.png

原來是因為預檢請求(option)沒有配置允許跨域准浴,導致請求后臺接口的時候一直失敗,并且剛好還提示是跨域的問題捎稚。

為啥 chrome 的 devtools 沒有清楚的顯示出來乐横,是因為預檢請求導致跨域調(diào)用接口失敗了呢求橄?

帶著這樣的疑問,我 google 了一下葡公,原來是因為從 Chrome 79 版本開始罐农,preflight cors request 相關信息就被隱藏掉了,變成了隱藏功能催什,并且從 2020.01.06 開始涵亏,這個功能將被徹底隱藏掉,不再提供相關功能了蒲凶。

詳細情況气筋,可以閱讀下相關頁面:OOR-CORS: Out of Renderer CORS

說實話,說這個消息令我震驚也不為過了旋圆。

因為以前我用 chrome 的時候宠默,確實發(fā)現(xiàn)他支持顯示 cors 相關的信息,后來我潛意識里一直就以為灵巧,這個功能一直是存在的搀矫。

我壓根就不會想到,這個功能會在 chrome 里被砍掉孩等。

可怕的是艾君,用了這么久,我居然一直沒有發(fā)現(xiàn)肄方,居然存在這樣的問題。

只能說以前之所以沒發(fā)現(xiàn)問題蹬癌,是因為恰好沒碰到過這樣的問題权她,在多種因素的作用下,導致最近這個問題才浮出水面逝薪,終于被我發(fā)現(xiàn)了隅要。

我稍微回想了一下,之所以現(xiàn)在才意識到這個問題董济,有幾個方面的原因:

  1. 有些情況下步清,直接配置了 Access-Control-Allow-Origin: *,導致根本不會遇到會有跨域的問題出現(xiàn)
  2. 有些情況下虏肾,都是簡單請求廓啊,不會觸發(fā)預檢請求
  3. 有些情況下,即使出現(xiàn)需要預檢請求封豪,可能也針對所有的請求進行過配置谴轮,不像這位同事的做法,只是針對 get吹埠、post第步、put 等請求進行了跨域配置

所以我更加深刻的理解了疮装,有時候,項目的代碼能正常跑起來粘都,確實是無數(shù)個巧合拼湊在一起的結(jié)果廓推,要是沒有深刻的理清各種技術的細枝末節(jié),一旦出了點 bug翩隧,就會困擾很久樊展,才能發(fā)現(xiàn)問題所在。

而且鸽心,這個問題滚局,在越大、越復雜的項目中顽频,更容易顯現(xiàn)藤肢。

水落石出

閑話不多說,拉回到我們的正題糯景。

既然我們現(xiàn)在已經(jīng)發(fā)現(xiàn)問題所在了嘁圈,聊聊解決方案吧。

如果你也用 nginx 的話蟀淮,可以像這樣配置一下最住,針對所有的預檢請求,允許其跨域怠惶,并返回 204涨缚,就能解決 option 跨域的問題了。

image.png

當然如果你不想允許所有的域名都能跨域發(fā)送預檢請求策治,并被服務器正常響應脓魏,把 * 改成允許的域名的列表就好了。

碰到了這個問題后通惫,也讓我開始思考之前大家一直討論過的問題茂翔,chrome 開始壟斷桌面端服務器的市場,讓 google 都快成為 web 標準協(xié)議的制定者了履腋,這其實并不是一種好現(xiàn)象珊燎。

屠龍勇士最終也終于變成了惡龍。

這個故事遵湖,應用在 chrome 和 ie 身上悔政,同樣適用。

所以為了反對壟斷奄侠,我們更應該多支持下卓箫,用起來不是那么順手的一些軟件。

這放在任何領域都是適用的垄潮,有了競爭才有差異化烹卒,才會想著提升產(chǎn)品闷盔、提升服務,一家獨大旅急、壟斷逢勾,無論是對于科技的進步還是普通用戶的利益來說,都是有害的藐吮。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溺拱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谣辞,更是在濱河造成了極大的恐慌迫摔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泥从,死亡現(xiàn)場離奇詭異句占,居然都是意外死亡,警方通過查閱死者的電腦和手機躯嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門纱烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祈餐,你說我怎么就攤上這事擂啥。” “怎么了帆阳?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵哺壶,是天一觀的道長。 經(jīng)常有香客問我蜒谤,道長变骡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任芭逝,我火速辦了婚禮,結(jié)果婚禮上渊胸,老公的妹妹穿的比我還像新娘旬盯。我一直安慰自己,他們只是感情好翎猛,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布胖翰。 她就那樣靜靜地躺著,像睡著了一般切厘。 火紅的嫁衣襯著肌膚如雪萨咳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天疫稿,我揣著相機與錄音培他,去河邊找鬼鹃两。 笑死,一個胖子當著我的面吹牛舀凛,可吹牛的內(nèi)容都是我干的俊扳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼猛遍,長吁一口氣:“原來是場噩夢啊……” “哼馋记!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懊烤,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤梯醒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腌紧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茸习,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年寄啼,在試婚紗的時候發(fā)現(xiàn)自己被綠了逮光。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡墩划,死狀恐怖涕刚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乙帮,我是刑警寧澤杜漠,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站察净,受9級特大地震影響驾茴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氢卡,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一锈至、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧译秦,春花似錦峡捡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阁吝,卻和暖如春砚婆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突勇。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工装盯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坷虑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓验夯,卻偏偏與公主長得像猖吴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挥转,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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