每個(gè)接觸前端的人都會(huì)遇到前端經(jīng)典跨域問題卧蜓,下面介紹幾種我所知道的跨解決方法
1.首先什么是跨域空繁?
即為不同域名之間相互訪問
2.那什么是不同域呢?
只要協(xié)議名圾叼,域名蛤克,端口號(hào),任一不同則為不同域
解決方法:
1.Jsonp:利用<script>標(biāo)簽的src屬性實(shí)現(xiàn)
script中src可以跨域加載別的域中文件
實(shí)現(xiàn)方法:
創(chuàng)建一個(gè)回調(diào)函數(shù)夷蚊,然后在遠(yuǎn)程服務(wù)上調(diào)用這個(gè)函數(shù)并且將JSON 數(shù)據(jù)形式作為參數(shù)傳遞构挤,完成回調(diào)。
將JSON數(shù)據(jù)填充進(jìn)回調(diào)函數(shù)
例:
//a.com
<script src="http://www.b.com/test.php?name=lisi&callback=aaa"></script>
在b.com中的test.php中可以接收傳遞過來的參數(shù)name還有callback惕鼓,然后執(zhí)行:
b.com中執(zhí)行回調(diào)函數(shù)的調(diào)用echo 'callback(要回傳給a.com的數(shù)據(jù))'
缺點(diǎn):只能進(jìn)行g(shù)et請(qǐng)求筋现,不支持post請(qǐng)求
2.服務(wù)器端代理:
服務(wù)器端是沒有跨域問題的
3.CORS(跨域資源共享)
基本思想:使用自定義的http 請(qǐng)求頭讓瀏覽器和服務(wù)器進(jìn)行溝通
將XHR對(duì)象的URL從相對(duì)路徑變?yōu)閯e的域下的絕對(duì)路徑
要使服務(wù)器端對(duì)CORS進(jìn)行支持,需要設(shè)置Access-Control-Allow-Origin
如果瀏覽器檢測到相應(yīng)設(shè)置,允許Ajax進(jìn)行跨域訪問
4.document.domain
只適用于不同子域的框架間交互
實(shí)現(xiàn)方法:將兩個(gè)頁面的document.domain設(shè)置為相同域名
document.domain只能設(shè)置自身或更高級(jí)的父域矾飞,且主域必須相同
document.domain=“”
5.window.name+iframe
window.name特征:在一個(gè)窗口聲明周期內(nèi)一膨,窗口載入的所有文件都是共享一個(gè)window.name的
每個(gè)頁面都有讀寫權(quán)利
主要實(shí)現(xiàn)需要三個(gè)頁面
a.com/app.html
a.com/proxy.html(代理文件)
b.com/data.html
首先在a.com/app.html 創(chuàng)建一個(gè)iframe 使其src指向數(shù)據(jù)頁面,數(shù)據(jù)頁面會(huì)把數(shù)據(jù)附加到iframe的window.name上
然后在應(yīng)用頁面監(jiān)聽iframe.onload事件洒沦,在事件中設(shè)置iframe的src屬性指向本地域代理文件
獲取數(shù)據(jù)后銷毀iframe