1. 程式人生 > >前端跨域問題有哪些常用的解決方式?

前端跨域問題有哪些常用的解決方式?

1.背景介紹

理解跨域首先必須要了解同源策略。同源策略是瀏覽器上為安全性考慮實施的非常重要的安全策略。

跨域是指一個域下的文件或指令碼試圖去請求另一個域下的資源,這裡跨域是廣義的。

廣義的跨域:

1.) 資源跳轉: A連結、重定向、表單提交

2.) 資源嵌入: link script img frame等dom標籤,還有樣式中background:url()、@font-face()等檔案外鏈

3.) 指令碼請求: js發起的ajax請求、dom和js物件的跨域操作等

同源策略/SOP(Same origin policy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議+域名+埠"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。

同源策略限制以下幾種行為:

1.) Cookie、LocalStorage 和 IndexDB 無法讀取

2.) DOM 和 JS物件無法獲得

3.) AJAX 請求不能傳送

2.知識剖析

瀏覽器支援的跨域方法

網頁為了獲取資源本身有些屬性可以跨域請求資源

link script @font-face

img video iframe

網頁支援的傳送請求的方法

Ajax 表單提交

1 JSONP

JSONP 是 JSON with padding(填充式 JSON 或引數式 JSON)的簡寫,是應用 JSON 的一種新方法。

JSONP 由兩部分組成:回撥函式和資料。回撥函式是當響應到來時應該在頁面中呼叫的函式。回撥函式的名字一般是在請求中指定的。而資料就是傳入回撥函式中的 JSON資料。

                    
                    function handleResponse(response){ 
                        alert("You’re at IP address " + response.ip + ", which is in " + 
                              response.city + ", " + response.region_name); 
                    } 
                     
                    var script = document.createElement("script"); 
                    script.src = "http://freegeoip.net/json/?callback=handleResponse"; 
                    document.body.insertBefore(script, document.body.firstChild); 
                

2 CORS - Cross-Origin Resource Sharing

通過 XHR 實現 Ajax 通訊的一個主要限制,來源於跨域安全策略。預設情況下,XHR 物件只能訪 問與包含它的頁面位於同一個域中的資源。這種安全策略可以預防某些惡意行為。但是,實現合理的跨 域請求對開發某些瀏覽器應用程式也是至關重要的。

CORS 背後的基本思想,就是使用自定義的 HTTP 頭部 讓瀏覽器與伺服器進行溝通,從而決定請求或響應是應該成功,還是應該失敗。

3 伺服器反向代理

這種方法基本思路是傳送正常的http請求,利用服務端之間的資源請求不會有跨域限制的特點,後臺伺服器轉發請求到目標伺服器請求資源。把跨域的問題交給伺服器實現。

Nginx反向代理: 前端發起的請求被Nginx攔截,再由Nginx代由轉發請求到資源伺服器請求資源。


                        location / {
                              proxy_pass http://127.0.0.1:5000;
                            }
                

3.常見問題

Nginx反向代理如何實現

4.解決方案


                        location ^~/cross_origin/ {
                            #重寫訪問路徑
                            rewrite ^~/cross_origin/(.*)$ /$1 break;
                              proxy_pass http://127.0.0.1:5000;
                            }
                

                    $.ajax({
                        url:'/cross_origin/get_json?type=20170126',
                        type:'GET',
                        dataType:'json',
                        success:function (data) {
                            $('#show').val(data.text)
                        }
                    })
                

5.編碼實戰

6.擴充套件思考

其他實現跨域的方法還有很多

與iframe相關的 location.hash、window.name、postMessage

WebSocket通訊協議以及其它Ajax的改進方法

如何選擇

比如單向的資料請求,我們應該優先選擇JSONP或者window.name,

雙向通訊優先採取location.hash

在未與資料提供方達成通訊協議的情況下我們也可以用server proxy的方式來抓取資料

7.參考文獻

參考二  JS 高程

8.更多討論

問:jsonp的優缺點

答:優點在於能夠直接訪問響應文字,支援在瀏覽器與伺服器之間雙向通訊。JSONP 是從其他域中載入程式碼執行。如果其他域不安全,很可能會在響應中夾帶一些惡意程式碼;其次,要確定 JSONP 請求是否失敗並不容易。

問:跨域的方式有哪些?

答:document.domain + iframe   location.hash + iframe  window.name + iframe  postMessage 

Nginx反向代理 CORS JSONP  web sockets 

問:同源策略是什麼

答:

同源策略是瀏覽器眾多重要的安全措施之一,它規定

不同源的客戶端指令碼在沒明確授權的情況下,不能讀寫對方的資源。

一個源由三個部分確定:協議(http與https)域名(頂域與子域,不同的子域)埠;這三個元素都要相同才是在同一個源下。

客戶端指令碼主要是指JavaScript和ActionScript(Flash)。

授權:伺服器通過某種方式告訴瀏覽器,另一個域下的指令碼可以訪問我。

資源:HTTP頭,DOM樹,Cookie,localStorage等。

技能樹.IT修真院   

 “我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。

這裡是技能樹.IT修真院,成千上萬的師兄在這裡找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。

快來與我一起學習吧~邀請連結 點選開啟連結