跨域產(chǎn)生的原因:
- 瀏覽器限制。如果瀏覽器發(fā)現(xiàn)請(qǐng)求是跨域的時(shí)候,就會(huì)做校驗(yàn),如果校驗(yàn)不通過(guò)就會(huì)報(bào)跨域的錯(cuò)誤
- 跨域。發(fā)出去的請(qǐng)求只要域名、端口、協(xié)議中的任意一個(gè)與當(dāng)前域不同的時(shí)候,都會(huì)發(fā)生跨域
- 發(fā)送的XHR(XMLHTTPRequest)請(qǐng)求。如果發(fā)送的不是xhr請(qǐng)求,無(wú)論是否跨域,瀏覽器都不會(huì)報(bào)錯(cuò)
只有這三種原因同時(shí)滿足時(shí),才會(huì)發(fā)生跨域
解決跨域的方法
- 瀏覽器角度。讓瀏覽器不做校驗(yàn),瀏覽器的設(shè)置跨域,在瀏覽器的屬性設(shè)置頁(yè)面的目標(biāo)輸入框加上--disable-web-security。這樣瀏覽器將不會(huì)去做校驗(yàn)了。但是每個(gè)人都需要去改動(dòng),不建議使用。
- 發(fā)送xhr請(qǐng)求角度。讓跨域的請(qǐng)求不發(fā)送xhr請(qǐng)求,就不會(huì)再報(bào)錯(cuò)了。辦法是使用jsonp:jsonp是非官方協(xié)議,是前后端的一種約定,前端使用ajax發(fā)送請(qǐng)求,dataType為jsonp,并且?guī)б粋€(gè)參數(shù)(默認(rèn)是callback),當(dāng)后臺(tái)發(fā)現(xiàn)這個(gè)參數(shù)之后,就知道這是一個(gè)jsonp請(qǐng)求,就會(huì)把原本返回json對(duì)象編程js返回,js代碼是一個(gè)函數(shù)的執(zhí)行,函數(shù)名是callback的參數(shù)值,函數(shù)的參數(shù)是原本的json對(duì)象。缺點(diǎn):1).只支持get方法請(qǐng)求;2).需要服務(wù)器修改代碼;3).發(fā)送的不是xhr請(qǐng)求
- 在跨域角度。1).被調(diào)用方解決:在響應(yīng)頭增加指定字段,告訴瀏覽器,允許調(diào)用,這種方法的原理是從根源支持跨域的。各種解決方式,請(qǐng)參考詳細(xì)解決筆記;2).調(diào)用方解決:這種解決辦法原理是隱藏跨域。使用代理,在同一個(gè)域請(qǐng)求不同的url地址,轉(zhuǎn)發(fā)到不同的域。






