跨域有很多種方式,下面就簡單說說跨域最常見的幾種解決方式
1凹髓、JSONP
JSONP是服務(wù)器與客戶端跨源通信的常用方法鸠删。最大特點(diǎn)就是簡單適用,兼容性好抛猫。主要利用html中script標(biāo)簽可以引入其他域的js文件蟆盹,利用這個特性可以實現(xiàn)跨域訪問接口,需要后端的支持闺金。實現(xiàn)步驟:
1.定義數(shù)據(jù)處理函數(shù)fun:
2.網(wǎng)頁通過添加一個<script>元素逾滥,src的地址執(zhí)行后端接口最后加個參數(shù)callback=fun,向服務(wù)器請求JSON數(shù)據(jù)败匹,這種做法不受同源政策限制寨昙;
3.服務(wù)器收到請求后,將數(shù)據(jù)放在fun回調(diào)函數(shù)里傳回來,輸出fun(data):
4.fun(data)會放到script標(biāo)簽作為js執(zhí)行掀亩,此時會調(diào)用fun(data),將data作為參數(shù)舔哪。
代碼地址
2、CORS
CORS全稱是"跨域資源共享"(Cross-origin resource sharing)槽棍。
它允許瀏覽器向跨源服務(wù)器捉蚤,發(fā)出XMLHttpRequest請求抬驴。支持現(xiàn)代瀏覽器,IE10以上瀏覽器缆巧。CORS需要瀏覽器和服務(wù)器的支持布持,因此,實現(xiàn)CORS通信的關(guān)鍵是服務(wù)器陕悬。只要服務(wù)器實現(xiàn)了CORS接口题暖,就可以跨源通信。
當(dāng)CORS請求滿足下面的條件時
1.請求方法是以下三種方法之一:
HEAD
GET
POST
2.HTTP的頭信息不超出以下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三個值application/x-www-form-urlencoded墩莫、multipart/form-data芙委、text/plain
基本思想是
1.當(dāng)使用XMLHttpRequest()發(fā)送請求的時候逞敷,瀏覽器發(fā)現(xiàn)該請求不符合同源策略狂秦,會給該請求的頭部信息添加一個origin字段,Origin字段用來說明推捐,本次請求來自哪個源裂问,服務(wù)器根據(jù)這個值,決定是否同意這次請求牛柒。
如果Origin指定的源堪簿,不被服務(wù)器允許,服務(wù)器也會返回正常的HTTP響應(yīng)皮壁,瀏覽器發(fā)現(xiàn)響應(yīng)頭沒有包含origin字段椭更,就拋出錯誤,被onerror回調(diào)函數(shù)捕獲蛾魄,這種錯誤狀態(tài)碼無法識別虑瀑。
2.如果指定的源,被服務(wù)器允許滴须,服務(wù)器返回響應(yīng)信息的響應(yīng)頭會包含origin的信息
代碼地址
多么痛的領(lǐng)悟舌狗,忘記重新啟動服務(wù)器了,結(jié)果沒有返回數(shù)據(jù)扔水,json解析一直報錯痛侍,以后記得重新啟動服務(wù)器。
3魔市、降域(document.domain)
document.domain用于主域相同子域不同的場景
降域的設(shè)置也是有限制的主届,只能把document.domain,設(shè)置成自身或者更高一級的域待德,且主域必須相同君丁,如:a.b.test.com中的某個文檔的域可以設(shè)置成a.b.test.com、b.test.com磅网、test.com谈截。但是不可以設(shè)置成.com或者c.a.b.test.com或者baidu.com,因為baidu.com主域和當(dāng)前域不同了。
使用方法
代碼地址
4簸喂、postMessage
postMessage是html5新增的方法毙死,可以實現(xiàn)跨文本檔、多窗口喻鳄、跨域消息傳遞扼倘。該方法可以通過綁定window的message事件來監(jiān)聽發(fā)送跨文檔消息傳輸內(nèi)容。postMessage(data,origin)方法接受兩個參數(shù):
1.data:要傳遞的數(shù)據(jù)除呵。
2.origin:字符串參數(shù)再菊,指明目標(biāo)窗口的源,協(xié)議+主機(jī)+端口號[+URL]颜曾,URL會被忽略纠拔,所以可以不寫,這個參數(shù)是為了安全考慮postMessage()方法只會將message傳遞給指定窗口泛豪,如果設(shè)置為"*"稠诲,這樣可以傳遞給任意窗口。
代碼地址