前端跨域的解決方案

子非魚丶發表於2019-04-20

跨域可以說是前端開發中很常見的一個問題了,雖然網上已經有很多類似的文章,不過本著記錄自己的學習總結想法,還是要自己寫一遍文章記錄一下所學知識。

為什麼會有跨域?

跨域的問題產生是因為瀏覽器的同源策略所導致的。同源策略的出發點是出於瀏覽器的安全所考慮的,如果每個人都可以隨意訪問其他站點的檔案資料,將會產生非常嚴重的安全問題。

那怎麼樣才算是跨域呢?在瀏覽器裡只要滿足以下條件任一個就算跨域:

  1. 請求協議不同
    例:http和https
  2. 域名不同
    例:xxx.com和mmm.com
  3. 埠不同
    例:xxx.com和xxx.com:81

跨域的幾種解決方法

1. JSONP

JSONP實現跨域的原理是動態建立script標籤,src是具有跨域訪問檔案的能力,建立指定的地址和呼叫特定的回撥方法獲取資料,JSONP只支援get方法。

2.CORS

CORS(跨域資源共享)實現跨域的原理是在http請求頭中加上指定的標記來告訴瀏覽器是否允許載入跨域的資源,也是現在主流的跨越解決方案。

3.iframe + location.hash

iframe+location.hash實現跨域是使用iframe載入資源,然後在iframe中修改父視窗的location.hash,因為location.hash的資訊會展示在url上,所以url的長度限制了我們傳輸資訊內容的長度。

4. iframe + window.name

iframe+location.hash實現跨域是使用iframe載入資源,然後在iframe視窗載入的內容修改window.name的值,使用了window.name的特性,在當前視窗頁所有載入的頁面共享一個window.name,但是window.name的容量限制為不超過2m。

5. iframe + document.domain

如果兩個頁面的主域名相同,但是子域名不同,可以修改document.domain為同一個域名,實現父子域名的跨域通訊,只限制主域名相同的情況下。(不算嚴格意義上的跨域)

6. postMessage

postMessage是html5標準的新特性,使用該api可以實現多種場景的跨域通訊,但是在一些比較老舊的瀏覽器可能不支援此方法。

7.反向代理

使用nginx或者nodejs中介軟體通過反向代理實現跨域訪問。

8.WebSocket協議

WebScoket協議支援跨域通訊。

總結

綜合以上幾種的跨域解決方案來看,解決跨域大都是在伺服器端,不管是從安全性還是實用性上來說。使用前端手段解決跨域的方案或多或少都有點缺陷,前端解決跨域的重點也是在圍繞src的能力來展開,不管是iframe還是動態建立script。

相關文章