因為瀏覽器出於安全考慮,有同源策略。也就是說,如果協議、網域名稱或者埠有乙個不同就是跨域,ajax 請求會失敗。
那麼是出於什麼安全考慮才會引入這種機制呢?其實主要是用來防止 csrf 攻擊的。簡單點說,csrf 攻擊是利用使用者的登入態發起惡意請求。
也就是說,沒有同源策略的情況下,a **可以被任意其他**的 ajax 訪問到內容。如果你當前 a **還存在登入態,那麼對方就可以通過 ajax 獲得你的任何資訊。當然跨域並不能完全阻止 csrf。
然後我們來考慮乙個問題,請求跨域了,那麼請求到底發出去沒有?請求必然是發出去了,但是瀏覽器攔截了響應。你可能會疑問明明通過表單的方式可以發起跨域請求,為什麼 ajax 就不會。因為歸根結底,跨域是為了阻止使用者讀取到另乙個網域名稱下的內容,ajax 可以獲取響應,瀏覽器認為這不安全,所以攔截了響應。但是表單並不會獲取新的內容,所以可以發起跨域請求。同時也說明了跨域並不能完全阻止 csrf,因為請求畢竟是發出去了。
jsonp 的原理很簡單,就是利用cors 需要瀏覽器和後端同時支援。ie 8 和 9 需要通過
xdomainrequest
來實現。
瀏覽器會自動進行 cors 通訊,實現 cors 通訊的關鍵是後端。只要後端實現了 cors,就實現了跨域。
服務端設定access-control-allow-origin
就可以開啟 cors。 該屬性表示哪些網域名稱可以訪問資源,如果設定萬用字元則表示所有**都可以訪問資源。
雖然設定 cors 和前端沒什麼關係,但是通過這種方式解決跨域問題的話,會在傳送請求時出現兩種情況,分別為簡單請求和複雜請求。
簡單請求
以 ajax 為例,當滿足以下條件時,會觸發簡單請求
使用下列方法之一:
content-type
的值僅限於下列三者之一:
請求中的任意xmlhttprequestupload
物件均沒有註冊任何事件***;xmlhttprequestupload
物件可以使用xmlhttprequest.upload
屬性訪問。
該方式只能用於二級網域名稱相同的情況下,比如a.test.com
和b.test.com
適用於該方式。
只需要給頁面新增document.domain = 'test.com'
表示二級網域名稱都相同就可以實現跨域
這種方式通常用於獲取嵌入頁面中的第三方頁面資料。乙個頁面傳送訊息,另乙個頁面判斷**並接收訊息
// 傳送訊息端
window.parent.postmessage('message', '')
// 接收訊息端
var mc = new messagechannel()
mc.addeventlistener('message', event =>
})
跨域解決方案
瀏覽器端的同源策略 如果兩個頁面的協議,埠和網域名稱中的其中任意乙個不相同,它們就是不同源的,瀏覽器會限制他們之間的資源互動 跨域 跨域的安全限制只針對瀏覽器,伺服器是沒有跨域的安全限制的 原理 由於伺服器沒有跨域限制,所以在需要跨域訪問時,在中間設定乙個中間層 舉例 192.168.10.1 80...
跨域解決方案
後端解決跨域的主要方式是,通過在響應頭中設定相關的跨域字段,用於告訴瀏覽器允許跨域請求資源。在前後端分離的場景中,登入頁面存在後端伺服器中,當登入成功後,需要發起跳轉請求,跳轉至前端首頁的情況。nginx響應頭相關配置 可指定匹配路徑,並不一定需要在location 下配置 在前後端分離的場景中,由...
跨域解決方案
跨域解決方案有哪些?方案一原理 動態建立乙個script標籤。利用script標籤的src屬性不受同源策略限制。因為所有的src屬性和href屬性都不受同源策略限制。可以請求第三方伺服器資料內容 步驟1 去建立乙個script標籤 步驟2 介面引數,必須要帶乙個自定義函式名 要不然後台無法返回資料 ...