相信很多人都聽說過跨域,但是很多人都不知道跨域是什么意思,那么,接下來我們來講解一下什么是跨域,以及怎么解決。
一:什么是跨域
跨域,是指瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實施的安全限制。瀏覽器從一個域名的網頁去請求另一個域名的資源時,出現域名、端口、協議任一不同,都屬于跨域。
二:跨域怎么解決
1、jsonp跨域
JSONP(JSON with padding:填充式JSON),應用JSON的一種新方法,
JSON、JSONP的區別:
1、JSON返回的是一串數據、JSONP返回的是腳本代碼(包含一個函數調用)
2、JSONP 只支持get請求、不支持post請求
(類似往頁面添加一個script標簽,通過src屬性去觸發對指定地址的請求,故只能是Get請求)
2、nginx反向代理:
www.baidu.com/index.html需要調用www.sina.com/server.php,可以寫一個接口www.baidu.com/server.php,由這個接口在后端去調用www.sina.com/server.php并拿到返回值,然后再返回給index.html
3、PHP端修改header
header(‘Access-Control-Allow-Origin:*’);//允許所有來源訪問
header(‘Access-Control-Allow-Method:POST,GET’);//允許訪問的方式
4、document.domain
跨域分為兩種,一種xhr不能訪問不同源的文檔,另一種是不同window之間不能進行交互操作;
document.domain主要是解決第二種情況,且只能適用于主域相同子域不同的情況;
document.domain的設置是有限制的,我們只能把document.domain設置成自身或更高一級的父域,且主域必須相同。例如:a.b.example.com中某個文檔的document.domain可以設成a.b.example.com、b.example.com 、example.com中的任意一個,但是不可以設成c.a.b.example.com,因為這是當前域的子域,也不可以設成baidu.com,因為主域已經不相同了。
5、window.name 關鍵點:window.name在頁面的生命周期里共享一個window.name;
兼容性:所有瀏覽器都支持;
優點:
最簡單的利用了瀏覽器的特性來做到不同域之間的數據傳遞;
不需要前端和后端的特殊配制;
缺點:
大小限制:window.name最大size是2M左右,不同瀏覽器中會有不同約定;
安全性:當前頁面所有window都可以修改,很不安全;
數據類型:傳遞數據只能限于字符串,如果是對象或者其他會自動被轉化為字符串。
6、postMessage
關鍵點:
postMessage是h5引入的一個新概念,現在也在進一步的推廣和發展中,他進行了一系列的封裝,我們可以通過window.postMessage的方式進行使用,并可以監聽其發送的消息;
兼容性:移動端可以放心用,但是pc端需要做降級處理
優點
不需要后端介入就可以做到跨域,一個函數外加兩個參數(請求url,發送數據)就可以搞定;
移動端兼容性好;