跨域問題
1.jsonp:動態插入
script
標籤,通過
script
標籤引入乙個
js檔案,這個檔案載入成功之後會執行我們在
url引數中制定的函式,並且會把我們需要的
json
資料傳入
**實現
jquery方法
$.getjson("",function dosomething(jsondata))
jquery會自動生成乙個全域性函式來替換callback=?中的問號,之後獲取到資料後又會自動銷毀,實際上就是起乙個臨時**函式的作用。
$.getjson會自動判斷是否跨域,不跨域的話,就呼叫普通的ajax方法;跨域的話,則會以非同步載入js檔案的形式來呼叫jsonp的**函式。
getjson: function( url, data, callback )
2.window.name+iframe
iframe的
src屬性由外域轉向本地域,跨域資料即由
iframe
的window.name
從外域傳遞到本地域,巧妙的繞過了瀏覽器的跨域訪問限制,name 值在不同的頁面(甚至不同網域名稱)載入後依舊存在,並且可以支援非常長的
name
值(2mb
)。**實現:
把data.html頁面載入進來?
顯然我們不能直接在跨域1.html頁面中通過改變window.location來載入data.html頁面,
因為我們想要即使跨域1.html頁面不跳轉也能得到data.html裡的資料。
答案就是在跨域1.html頁面中使用乙個隱藏的iframe來充當乙個中間人角色,由iframe去獲取data.html的資料,然後跨域1.html再去得到iframe獲取到的資料。
充當中間人的iframe想要獲取到data.html的通過window.name設定的資料,只需要把這個iframe的src設為data.html就行了。然後跨域1.html想要得到iframe所獲取到的資料,也就是想要得到iframe的window.name的值,還必須把這個iframe的src設成跟跨域1.html頁面同乙個域才行,不然根據前面講的同源策略,跨域1.html是不能訪問到
iframe
裡的window.name
屬性的。這就是設定iframe的src='同目錄沒有用.html'的原因。
3.h5中的
postmessage
跨文件資訊傳輸
cross document messaging
**實現:
a.html
window.onload = function()
window.addeventlistener('message', function(e) );
b.html
window.addeventlistener('message', function(e) {
if(e.source != window.parent) {
return;
let data = e.data;
console.log('b.html 接收到的訊息
:', data);
parent.postmessage('我已經接收到訊息了
!', e.origin);
4.cors 是乙個
w3c
標準,全稱是
"跨域資源共享"(
cross-origin resource sharing
)它允許瀏覽器向跨源伺服器,發出
請求,從而克服了
ajax
只能同源使用的限制。
cors 需要瀏覽器和伺服器同時支援才可以生效,對於開發者來說,
cors
通訊與同源的
ajax
通訊沒有差別,**完全一樣。瀏覽器一旦發現
ajax
請求跨源,就會自動新增一些附加的頭資訊,有時還會多出一次附加的請求,但使用者不會有感覺。
因此,實現 cors 通訊的關鍵是伺服器。只要伺服器實現了
cors
介面,就可以跨源通訊。伺服器設定相應頭中的 access-control-allow-origin,瀏覽器允許跨域請求,需要瀏覽器支援h5,
該值要與請求頭中 origin一致才能生效,否則將跨域失敗。
跨域解決方案
因為瀏覽器出於安全考慮,有同源策略。也就是說,如果協議 網域名稱或者埠有乙個不同就是跨域,ajax 請求會失敗。那麼是出於什麼安全考慮才會引入這種機制呢?其實主要是用來防止 csrf 攻擊的。簡單點說,csrf 攻擊是利用使用者的登入態發起惡意請求。也就是說,沒有同源策略的情況下,a 可以被任意其他...
跨域解決方案
瀏覽器端的同源策略 如果兩個頁面的協議,埠和網域名稱中的其中任意乙個不相同,它們就是不同源的,瀏覽器會限制他們之間的資源互動 跨域 跨域的安全限制只針對瀏覽器,伺服器是沒有跨域的安全限制的 原理 由於伺服器沒有跨域限制,所以在需要跨域訪問時,在中間設定乙個中間層 舉例 192.168.10.1 80...
跨域解決方案
後端解決跨域的主要方式是,通過在響應頭中設定相關的跨域字段,用於告訴瀏覽器允許跨域請求資源。在前後端分離的場景中,登入頁面存在後端伺服器中,當登入成功後,需要發起跳轉請求,跳轉至前端首頁的情況。nginx響應頭相關配置 可指定匹配路徑,並不一定需要在location 下配置 在前後端分離的場景中,由...