介紹
CORS(Cross-Origin Resource Sharing)是指跨域資源共享,用於解決前端跨域問題。跨域問題最參見的方法就是使用JSONP
,但是很多跨域問題JSONP
是無法解決的,比如
POST跨域請求
'script error'
的指令碼錯誤提示canvas
中無法獲得跨域圖片的資訊
如果使用CORS
,上面幾個問題都可以解決。
CORS的原理
服務端對header
設定一個Access-Control-Allow-Origin: *
,開啟跨域請求。*
表示接受所有域名的請求。也可以指定特定的域名 Access-Control-Allow-Origin: http://www.client.com
。
我專門整理了一個使用CORS
解決跨域的例子。可以去github上下載。
在github
的例子中,需要設定host
, 將www.client.com
和www.server.com
都指向本地。然後使用本地伺服器來測試。
127.0.0.1 www.client.com
127.0.0.1 www.server.com
其中www.client.com
是指當前頁面的域名,www.server.com
是第三方的域名。
CORS解決普通跨域請求
github的例子中,scripts/client.js
中對www.server.com
域名傳送ajax
請求。當www.server.com
沒有對header
的Access-Control-Allow-Origin
進行設定時,請求是報錯的。如圖:
設定Access-Control-Allow-Origin
後,可以正常獲得資料。如下圖,第一張是返回的結果,第二張是headers
資訊。
CORS解決跨域指令碼報錯問題
同源策略影響到的不僅僅是ajax
請求跨域介面,對跨域資源(包括js,圖片等)也會有限制。比如www.client.com
域名下頁面請求了一個www.server.com
域名下的js
資源server.js
,js
資源可以被正常載入和執行。但是當js
資源中發生錯誤,有error
丟擲時,www.client.com
中是無法知道error
的細節的。demo
中index.html
頁面對onerror
進行了處理,輸出錯誤資訊。但是當跨域資源www.server.com/demo/cors/scripts/server.js
中丟擲異常時,只能顯示'script error'
資訊。如圖:
要支援跨域指令碼error
資訊的輸出,需要兩步:
伺服器對
js
資源的header
做Access-Control-Allow-Origin
的設定script
標籤中新增屬性crossorigin="anonymous"
加上上面的邏輯後,錯誤資訊就可以正常輸出了:
CORS解決跨域圖片資訊獲取
圖片作為一種資源,也會受到同源策略的影響。比如,www.client.com
域名下的頁面,透過canvas
繪製了一個www.server.com
域名的圖片,當使用canvas
的toBlob()
, toDataURL()
, getImageData()
時,會有error
發生。如圖:
如果對圖片的header
設定了Access-Control-Allow-Origin
,就可以正常呼叫這些方法。