關於跨域問題有很多的解決方案,這裡我們總結一下目前最通用最強大的解決方案: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
post
http的頭資訊不超出以下幾種字段:
accept
accept-language
content-language
last-event-id
實現方法非常簡單,只需要把伺服器的響應報文裡的access-control-allow-origin
設定為*
或者包含由origin
指明的站點。
access-control-allow-origin
是http響應報文中的乙個字段,origin
是http請求報文中的以乙個字段,如果不清楚這兩個字段的話,可以自行查閱關於http報文的知識,比如http | mdn。
複雜請求就是比簡單請求多了個預檢請求(preflight)而已。
預檢請求就是瀏覽器先詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動詞和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的xmlhttprequest請求,否則就報錯。
預檢請求用的請求方法是options
,表示這個請求是用來詢問的。頭資訊裡面,關鍵字段是origin
,表示請求來自哪個源。除了origin
字段,還有兩個字段非常重要:access-control-request-method
和access-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 的資料。只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域。一句話,說明白跨域 跨域,指的是瀏覽器不能執行其他 的指令碼。它是由...