CORS 理解(不要那麼多術語)

2022-09-18 14:06:12 字數 1538 閱讀 9135

談到跨域,不論前端還是後端,多少有點談虎色變,面試中也常會問到這些問題,瀏覽器和伺服器端到底怎麼做才能跨域,他們都做了什麼?

同源,字面意義是相同的源頭,即同乙個web伺服器(比如tomcat啟動的乙個例項),好比乙個家庭;跨域就是從乙個web伺服器向另乙個伺服器傳送或獲取資料,好比去鄰居家拿東西。之所以要做跨域限制,是為了安全,你不能從鄰居家直接拿吧,總得問過人家。

那麼怎麼來判斷同源?就看乙個web伺服器的根本三要素:協議、web伺服器網域名稱、埠號。

比如:當前頁面的位址是,源就是,當新請求的協議、網域名稱、埠號與之完全一致即是同源,否則是跨域。

對於下面傳送的請求,瀏覽器的判決如下:

假設我們點選乙個按鈕去獲取資料,獲取資料的請求準備從瀏覽器發出,這時瀏覽器先會檢測這條請求是同源還是跨域,也就是與按鈕所在頁面的位址是同源還是跨域,如果是同源,好說,直接傳送出去;如果是跨域的請求,那就得hold住先,瀏覽器會在請求的http header中加上乙個origin欄位,標明這個請求是從**發出來的,例如:origin:,這樣伺服器端好辨識是自己家人來取東西,還是隔壁老王來借東西了。

那些做檢測、加header欄位等事情全是瀏覽器做,對於前端開發者來說,什麼事都不用幹,ajax請求平時怎麼傳送,跨域時還怎麼傳送。可見,跨域對於前端沒影響,關鍵在於伺服器端。

每個web伺服器就像乙個家庭。好鄰居要吃螃蟹來借點醋,這沒問題;壞鄰居家有醋要來借點螃蟹,這不干。

伺服器收到請求會給與響應,響應的header裡寫明跨域的配置資訊,告訴瀏覽器,它允許哪些網域名稱發來的請求訪問,哪些method可以執行。瀏覽器收到響應後自動判斷能不能真正執行請求。

假設伺服器網域名稱是,它收到了乙個從發來的請求,伺服器響應它,在響應中寫明本伺服器支援哪些網域名稱可以訪問,哪些method可以執行,瀏覽器收到後做匹配,再判定。

那麼,伺服器有哪些判定的規則呢?

乙個支援cors的web伺服器,有如下的判定字段,他們會在響應的header中寫明

其中access-control-allow-origin(訪問控制之允許的源),在響應的http header中必須有的,表示允許訪問本伺服器的源頭origin(網域名稱),可以是特定的網域名稱列表,用逗號分隔,也可以是萬用字元*,表示支援任意網域名稱的訪問。

除了限定源頭origin,還會限制請求的方法methodheader

如,如果伺服器設定access-control-allow-methods:get,那麼跨域的post請求無法在這個伺服器執行。

跨域的請求分兩種,一種是簡單請求,一種是非簡單請求(廢話)。

非簡單請求就是其他請求

簡單請求瀏覽器會直接在請求的header加上origin欄位再傳送;非簡單請求瀏覽器則會先傳送一次預檢請求,根據預檢請求的結果,決定是否正式傳送請求。

詳情可以訪問阮一峰的日誌:跨域資源共享 cors 詳解

為何那麼多女人不想嫁人

為何那麼多女人不想嫁人?為何我不願意嫁給你?你叫我給你乙個理由,是的,我有理由。理由是 結了婚,我不再是情人,也不再重要,我只是乙個黃臉婆。我不願意被冷落。理由是 結了婚,我的地位遠遠落後你家的每乙個人,我再也得不到關愛的眼神。理由是 結了婚,所有親友的問候語就會變成 什麼時候生小孩啊?我不要生小孩...

為什麼那麼多「偽需求」?

為什麼有那麼多 偽需求 做產品或做工具,經常碰到 偽需求 的問題,其實業界早有定論,使用者說不清楚自己的需求是什麼?有兩個流行的著名故事,第乙個故事,在汽車出現之前,福特去調研使用者,眾多使用者表示 我們需要一輛更快的馬車 第二個故事,大學城邊酒店林立,競爭激烈,其中一家的酒店老闆開始使用者調研,每...

為什麼華為加班那麼多

為什麼華為加班那麼多?十年前,pc機 個人電腦 的記憶體還是256k,512k為主流,再往前,記憶體就更小了。為了節省空間,編寫的程式都是很精練的。是否還記得有這樣一道演算法題 不用額外的變數,交換兩個變數的值。連乙個臨時變數的空間都節省了。現在的pc機記憶體已是4g,8g為主流了,伺服器的記憶體就...