CORS(Cross-Origin Resource Sharing)是指跨域資源共享,用於解決前端跨域問題。跨域問題最參見的方法就是使用JSONP
,可是不少跨域問題JSONP
是沒法解決的,好比html
POST跨域請求前端
'script error'
的腳本錯誤提示git
canvas
中沒法得到跨域圖片的信息
若是使用CORS
,上面幾個問題均可以解決。github
服務端對header
設置一個Access-Control-Allow-Origin: *
,開啓跨域請求。*
表示接受全部域名的請求。也能夠指定特定的域名 Access-Control-Allow-Origin: http://www.client.com
。
我專門整理了一個使用CORS
解決跨域的例子。能夠去github上下載。
在github
的例子中,須要設置host
, 將www.client.com
和www.server.com
都指向本地。而後使用本地服務器來測試。ajax
127.0.0.1 www.client.com 127.0.0.1 www.server.com
其中www.client.com
是指當前頁面的域名,www.server.com
是第三方的域名。canvas
github的例子中,scripts/client.js
中對www.server.com
域名發送ajax
請求。當www.server.com
沒有對header
的Access-Control-Allow-Origin
進行設置時,請求是報錯的。如圖:跨域
設置Access-Control-Allow-Origin
後,能夠正常得到數據。以下圖,第一張是返回的結果,第二張是headers
信息。服務器
同源策略影響到的不單單是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'
信息。如圖:cors
要支持跨域腳本error
信息的輸出,須要兩步:測試
服務器對js
資源的header
作Access-Control-Allow-Origin
的設置
script
標籤中添加屬性crossorigin="anonymous"
加上上面的邏輯後,錯誤信息就能夠正常輸出了:
圖片做爲一種資源,也會受到同源策略的影響。好比,www.client.com
域名下的頁面,經過canvas
繪製了一個www.server.com
域名的圖片,當使用canvas
的toBlob()
, toDataURL()
, getImageData()
時,會有error
發生。如圖:
若是對圖片的header
設置了Access-Control-Allow-Origin
,就能夠正常調用這些方法。