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