同源與跨域
通常狀況下,禁止一個域從另外一個域讀取數據,卻可使用某些從其餘域拿到的資源。好比說,容許一個域執行、渲染、應用從其餘域獲取到的腳本、圖片、樣式;一樣,一個域能夠展現從其餘域獲取的內容,好比在frame中顯示html文檔。網絡資源也能夠選擇性的讓其餘域來讀取本身的信息,好比使用Cross-Origin Resource Sharing,這種狀況下訪問權是針對單個域受權的。同源策略的控制者是瀏覽器,瀏覽器能夠控制不一樣域之間的資源的訪問或相互操做,但不控制本身對不一樣域之間的資源的操做和訪問。css
同源策略
源:由協議【https、http】+域名【a.com】+端口【80、443】組成,(ie中略有不一樣),同源策略是瀏覽器的核心安全策略,目的是未來自不一樣源的資源進行隔離,並控制不一樣源資源間的通訊,從而減小安全威脅,加強安全性。html
跨域中的一些限制以及不限制內容以下:前端
不限制內容:後端
- 腳本文件 js
- 圖片資源
- 樣式資源css
- iframe展現其餘的的資源
- a連接訪問其餘資源
- 多媒體等資源
- form表單提交
限制內容:跨域
- 跨域的方法【get、post能夠】
- 跨域請求頭不能夠添加自定義頭部
- 本地文件系統讀寫
- iframe能夠訪問iframe總體,不能訪問內容
- cookie的限制,使用CORS須要withCredentials=true才能夠帶上cookie
跨域方法
- 使用反向代理,避免跨域,經過後端來完成跨域部分
- JSONP方式,利用js文件的跨域容許,而且js文件請求到了,就會執行該js腳本,如此能夠在前端定義好function callback(data){};這樣去請求後端的js文件,文件的內容包括了須要的數據,可是返回的是一個函數callback(data);這樣就會調用前端腳本寫好的callback方法,把data當作參數使用
- CORS(Cross Origin Resource Sharing),經過協商HTTP Header讓瀏覽器和服務端進行通訊,來決定請求或者響應是否有效,默認狀況下,瀏覽器發送跨域請求不帶認證信息(好比cookie,證書,代理認證信息等),withCredentials屬性值爲false,後端響應設置Access-Control-Allow-Origin容許該域,或者爲*,若是須要cookie認證信息跨域須要withCredentials=true,同時服務端容許Access-Control-Allow-Credentials:true,同時Access-Control-Allow-Origin 值不能爲
*
;使用CORS瀏覽器將CORS請求分紅兩類:簡單請求(simple request)和非簡單請求(not-so-simple request),只要同時知足如下兩大條件,就屬於簡單請求。
1) 請求方法是如下三種方法之一:
HEAD
GET
POST
(2)HTTP的頭信息不超出如下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain
對於非簡單請求、會發起預檢請求Options來確認是否容許跨域,這種方法老的瀏覽器不必定支持。fetch方法在移動端使用較多,也能夠配合CORS來完成跨域。瀏覽器
- form表單提交,這樣能夠提交數據,可是進行交互有點困難;
- window.name + iframe的使用,可使用iframe定義一個窗口window,經過後端或者頁面iframe的src頁面的js腳本配合,把數據放在這個window.name上,最大能夠存儲2M的數據,而後主域能夠把這個iframe的src設置爲什麼主域同域的中間頁,而此時iframe的window.name並不會變,這樣主頁就能夠獲取該iframe的window.name來獲取數據。參考連接
- document.domain能夠完成兩個頂級域名下的子域名之間的通訊
- postMessage是H5中的window之間的通訊方式。
- WebSocket能夠隨便玩