同源是指:協議、域名、端口 三者相同,三者相同,則稱爲在同一個域中。web
一個域內的腳本僅僅具備本域內的權限,能夠理解爲本域腳本只能讀寫本域內的資源,而沒法訪問其它域的資源。現代瀏覽器在安全性和可用性之間選擇了一個平衡點。在遵循同源策略的基礎上,選擇性地爲同源策略「開放了後門」,如script、img、link等容許跨域訪問資源,容許這些資源能夠部署在其餘服務器上,從而下降服務器的壓力。ajax
同源限制最經常使用的體如今:後端
Cookie:瀏覽器發起的請求只能帶本域下的cookie;若是沒有這個限制,cookie至關於暴露在全部網站下,全部人均可以讀取。跨域
DOM:不容許經過iframe來加載其餘域下的頁面;由於父頁面能夠獲取到iframe中的dom,從而獲取到裏面用戶信息,不安全。瀏覽器
Ajax:不容許經過ajax來跨域請求資源安全
localStorage:不容許跨域訪問別人localStorage服務器
啓用CORS支持可使AJAX跨域請求,不過須要另外一個域的後端作一些相應配合才能夠。接下來演示一下AJAX跨域錯誤以及如何啓用CORS(goLang後端):cookie
一個簡單的服務器,監聽了19090端口,對請求迴應一個簡單的字符串:dom
如下客戶端代碼去請求上面的接口。頁面運行在webstorm server 63342端口中,二者端口不一樣,屬於跨域。webstorm
運行報錯:
可是響應中的確有咱們想要的數據:
可見,服務器已經針對咱們的請求做出了響應,只不過被瀏覽器給攔截了。解決辦法就是在服務器中添加一個響應頭,把服務器中這句代碼打開:
以上至關於配置一個白名單,容許這個域下進行跨域請求,讓瀏覽器不要去攔截個人響應。從新運行,能夠成功請求了。
跨域請求下的cookie操做
在服務器響應的同時,回寫一個cookie以及輸出請求中的cookie
運行以前的客戶端代碼,可見完成跨域請求後,瀏覽器的確收到了一個cookie
客戶端再執行相同的請求,發現服務器接受到的請求中,沒有帶上次的cookie。在客戶端請求時多加一句代碼:
再次請求,發現請求中已經有帶cookie了,並且服務器能夠接收到cookie了:
服務器響應後,瀏覽器再次報錯,看來響應又被攔截了
須要在服務器多加一行代碼:
重啓服務器,一切都正常運行了,跨域請求能夠帶上cookie了,並且當前腳本能夠獲取那個域下的cookie了: