第一篇原創博客。
最近一值在學習跨域請求的方式,由於都沒有在實際的項目中使用過,但在一些面試中又會一直被問到,每次都答的不全,而且答不出各自的使用限制,並不是真正的理解了如何跨域,最近一直在找網上查找這些資料,將自己學習的整理出(沒有具體的例子)加深一下理解,如有錯誤歡迎大家指正,也歡迎補充(好像也沒人會看我的博客耶,哈哈,)。
跨域請求存在的原因:由於瀏覽器的同源策略,即屬於不同域的頁面之間不能相互訪問各自的頁面內容。
跨域的場景: 1.域名不同 (www.yangwei.com 和www.wuyu.com 即為不同的域名)
2.二級域名相同,子域名不同 (www.wuhan.yangwei.com www.shenzheng.yangwei.com 為子域不同)
3.端口不同,協議不同 ( http://www.yangwei.com 和https://www.yangwei.com屬於跨域www.yangwei.con:8888和www.yangwei.con:8080)
跨域的方式:
1.前端的方式: possMessage,window.name,document.domain,image.src(得不到數據返回),jsonP(script.src后台不配合得不到數據返回),style.href(得不到數據返回)
一.imge.src,script.src,style.href 不受同源策略的影響可以加載其他域的資源,可以用這個特性,向服務器發送數據。最常用的就是使用image.src 向服務器發送前端的錯誤信息。image.src 和style.href 是無法獲取服務器的數據返回的,script.src 服務器端配合可以得到數據返回。
二possMessage,window.name,document.domain 是兩個窗口直接相互傳遞數據。
(1)possMessage 是HTML5中新增的,使用限制是 必須獲得窗口的window 引用。IE8+支持,firefox,chrome,safair,opera支持
(2)window.name ,在一個頁面中打開另一個頁面時,window.name 是共享的,所以可以通過window.name 來傳遞數據,window.name的限制大小是2M,這個所有瀏覽 器都支持,且沒有什么限制。
(3) document.domain 將兩個頁面的document.domain 設置成相同,document.domain 只能設置成父級域名,既可以訪問,使用限制:這頂級域名必須相同
2.純后端方式: CORS,服務器代理
CORS 是w3c標准的方式,通過在web服務器端設置:響應頭Access-Cntrol-Alow-Origin 來指定哪些域可以訪問本域的數據,ie8&9(XDomainRequest),10+,chrom4 ,firefox3.5,safair4,opera12支持這種方式。
服務器代理,同源策略只存在瀏覽器端,通過服務器轉發請求可以達到跨域請求的目的,劣勢:增加服務器的負擔,且訪問速度慢。
3.前后端結合:JsonP
script.src 不受同源策略的限制,所以可以動態的創建script標簽,將要請求數據的域寫在src 中參數中附帶回調的方法,服務器端返回回調函數的字符串,並帶參數。
如 script.src="http://www.yangwei.com/?id=001&callback=getInfoCallback,服務器端返回 getInfoCallBack("name:yangwei;age:18") 這段代碼會直接執行,在前面定義好getInfoCallBack函數,既可以獲得數據並解析。 這種是最長見的方式。
4.websocke
2跨域請求發送cookie,如果后端配置了 Access-Control-Allow-Origin:* 默認發起ajax跨域請求時,瀏覽器是不會攜帶cookie的,如果設置xhr.withCredentials=true,既可以攜帶cookie, 但是后台配置的Access-Control-Allow-Origin 不能為*,要為具體的域名.
在axios中設置withCredentials=true