1. 程式人生 > >關於跨域的理解

關於跨域的理解

文檔 json 情況 依靠 周期 name https post請求 script

什麽是跨域?
瀏覽器從一個域名的網頁去請求另一個域名的資源時,域名、端口、協議任一不同,都是跨域

主域名不同 http://www.baidu.com/index.html –>http://www.sina.com/index.js
子域名不同 http://www.tieba.baidu.com/index.html –>http://www.map.baidu.com/index.js
域名和域名ip http://www.baidu.com/index.html –>http://110.129.131.27/index.js
端口不同 http://www.baidu.com:8080/index.html–> http://www.baidu.com:8081

/index.js
協議不同 http://www.baidu.com:8080/index.html–> https://www.baidu.com:8080/index.js

備註:
1、端口和協議的不同,只能通過後臺來解決
2、localhost和127.0.0.1雖然都指向本機,但也屬於跨域
3、同源策略是指,請求的url地址,必須與瀏覽器上的url地址處於同域上,即域名相同,端口相同,協議相同

如何解決跨域問題?

JSONP:
jsonp全稱是json with padding,是為了解決跨域請求資源而產生的解決方案,是一種依靠開發人員創造出的非官方跨域數據交互協議。
JSON、JSONP的區別:
1、JSON返回的是一串數據、JSONP返回的是腳本代碼(包含一個函數調用)
2、JSONP 只支持get請求、不支持post請求(類似往頁面添加一個script標簽,通過src屬性去觸發對指定地址的請求,故只能是Get請求)
JSONP(JSON with Padding:填充式JSON),應用JSON的一種新方法

nginx反向代理:
www.baidu.com/index.html需要調用www.sina.com/server.php,可以寫一個接口www.baidu.com/server.php,由這個接口在後端去調用
www.sina.com/server.php並拿到返回值,然後再返回給index.html

PHP端修改header:
header(‘Access-Control-Allow-Origin:*’);//允許所有來源訪問
header(‘Access-Control-Allow-Method:POST,GET’);//允許訪問的方式

document.domain:
跨域分為兩種,一種xhr不能訪問不同源的文檔,另一種是不同window之間不能進行交互操作;
document.domain主要是解決第二種情況,且只能適用於主域相同子域不同的情況;
document.domain的設置是有限制的,我們只能把document.domain設置成自身或更高一級的父域,且主域必須相同。

window.name:
關鍵點:window.name在頁面的生命周期裏共享一個window.name;
兼容性:所有瀏覽器都支持;
優點:
最簡單的利用了瀏覽器的特性來做到不同域之間的數據傳遞;
不需要前端和後端的特殊配制;
缺點:
大小限制:window.name最大size是2M左右,不同瀏覽器中會有不同約定;
安全性:當前頁面所有window都可以修改,很不安全;

關於跨域的理解