跨域問題的根本解決方案CORS

2021-09-14 02:14:39 字數 2185 閱讀 9356

關於跨域問題有很多的解決方案,這裡我們總結一下目前最通用最強大的解決方案:cors。

w3c 的 web 工作組推薦了一種新的機制,即跨域資源共享(cross-origin resource sharing),簡稱cors。其實這個機制就是實現了跨站訪問控制,使得安全地進行跨站資料傳輸成為可能。

跨源資源共享標準( cross-origin sharing standard) 使得以下場景可以使用跨站 http 請求:

使用 xmlhttprequest 或 fetch發起跨站 http 請求。

web 字型 (css 中通過 @font-face 使用跨站字型資源),因此,**就可以發布 truetype 字型資源,並只允許已授權**進行跨站呼叫。

webgl 貼圖

使用drawimage繪製

images/video 畫面到canvas.

樣式表(使用 cssom)

scripts (for unmuted exceptions)

cors分為簡單請求複雜請求,處理方法也是有不同的,所以我們分別總結。

什麼是簡單請求呢?同時滿足以下兩個條件,就是簡單請求:

請求是下列之一:

head

get

posthttp的頭資訊不超出以下幾種字段:

accept

accept-language

content-language

last-event-id

實現方法非常簡單,只需要把伺服器的響應報文裡的access-control-allow-origin設定為*或者包含由origin指明的站點。

access-control-allow-originhttp響應報文中的乙個字段,originhttp請求報文中的以乙個字段,如果不清楚這兩個字段的話,可以自行查閱關於http報文的知識,比如http | mdn。

複雜請求就是比簡單請求多了個預檢請求(preflight)而已。

預檢請求就是瀏覽器先詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動詞和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的xmlhttprequest請求,否則就報錯。

預檢請求用的請求方法是options,表示這個請求是用來詢問的。頭資訊裡面,關鍵字段是origin,表示請求來自哪個源。除了origin字段,還有兩個字段非常重要:access-control-request-methodaccess-control-request-headers,分別表示允許的請求方法和請求頭。

舉乙個具體的例子:

現在,我們有乙個頁面向伺服器傳送了乙個post請求,並且我們自己定義了乙個請求頭欄位my-header,這時候瀏覽器就會首先傳送乙個option請求來做預檢請求,請求頭里有以下字段:

access-control-request-method: post

access-control-request-headers: my-header

如果預檢請求成功的話,響應頭里的內容如下:

access-control-allow-origin:  //表明伺服器允許的請求

access-control-allow-methods: post, get, options //表明伺服器可以接受post, get和 options的請求方法

access-control-allow-headers: my-header //傳遞乙個可接受的自定義請求頭列表

access-control-max-age: 3000000 //告訴瀏覽器,本次預檢請求的響應結果有效時間是多久

以上就是cors方法解決跨域問題的流程,cors支援所有型別的http請求,是目前跨域問題的根本解決方案。

CORS跨域解決方案

這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域。cors允許瀏覽器向跨源伺服器,發出xmlhttprequest請求,從而克服了a...

跨域解決方案CORS

cors 需要瀏覽器和後端同時支援。ie 8 和 9 需要通過 xdomainrequest 來實現。瀏覽器會自動進行 cors 通訊,實現 cors 通訊的關鍵是後端。只要後端實現了 cors,就實現了跨域。服務端設定 access control allow origin 就可以開啟 cors。...

跨域解決方案CORS

js跨域請求 這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域。一句話,說明白跨域 跨域,指的是瀏覽器不能執行其他 的指令碼。它是由...