為什么存在跨域
首先要知道,不管是簡(jiǎn)單請(qǐng)求還是復(fù)雜請(qǐng)求,服務(wù)端每次都是要對(duì)跨域和資源進(jìn)行判斷的(客戶端的順滑只是服務(wù)端的偽裝罷了~)衬以∪排海跨域只是瀏覽器的一種保護(hù)機(jī)制缓苛,是為了保護(hù)站點(diǎn)的安全,其實(shí)跨域本身是不存在的邓深,為了安全瀏覽器針對(duì)XMLHTTPRequest和fetch這種腳本發(fā)起的跨域請(qǐng)求做了一定的跨域限制未桥,而對(duì)于瀏覽器自身的如img的src、script的js資源芥备、form表單的提交冬耿,沒有做跨域的限制。
- 簡(jiǎn)單請(qǐng)求:這是因?yàn)閕mg的src萌壳、script的js只能發(fā)起get請(qǐng)求亦镶,而表單雖然能進(jìn)行post提交,但一方面表單的提交是顯式的讶凉,用戶可以感知染乌,另一方面,表單提交只能發(fā)起請(qǐng)求懂讯,而不能獲取請(qǐng)求的響應(yīng)荷憋,這樣一來(lái),請(qǐng)求可以發(fā)起褐望,而服務(wù)端可以進(jìn)行拒絕勒庄,瀏覽器認(rèn)為這是安全的。
- 復(fù)雜請(qǐng)求:通過(guò)腳本發(fā)起的跨域請(qǐng)求瘫里,可以對(duì)響應(yīng)內(nèi)容做處理实蔽,這是用戶不可感知的,瀏覽器認(rèn)為這是不安全的谨读,所以對(duì)于復(fù)雜請(qǐng)求局装,進(jìn)行跨域的限制,而CORS機(jī)制就是瀏覽器對(duì)跨域進(jìn)行處理。對(duì)于復(fù)雜請(qǐng)求會(huì)發(fā)起一個(gè)預(yù)檢請(qǐng)求铐尚,判斷服務(wù)端是否可以接受這個(gè)跨域請(qǐng)求拨脉,接受后就可以向服務(wù)端發(fā)起真正的請(qǐng)求。
為什么要區(qū)分簡(jiǎn)單和非簡(jiǎn)單請(qǐng)求
1宣增、因?yàn)闉g覽器認(rèn)為簡(jiǎn)單請(qǐng)求是安全的玫膀,所以可以通過(guò)跨域限制到達(dá)服務(wù)器,也就沒必要對(duì)簡(jiǎn)單請(qǐng)求做預(yù)檢請(qǐng)求(人家本來(lái)就可以通過(guò)跨域你預(yù)檢個(gè)什么)
2爹脾、當(dāng)然簡(jiǎn)單請(qǐng)求也進(jìn)行預(yù)檢帖旨,不過(guò)沒必要,因?yàn)轭A(yù)檢請(qǐng)求是干嘛的呢你要知道灵妨。
為什么要發(fā)起預(yù)檢請(qǐng)求
瀏覽器進(jìn)行跨域限制主要是通過(guò)兩種方式
- 限制跨域請(qǐng)求的發(fā)出
- 請(qǐng)求可以發(fā)出解阅,但是響應(yīng)結(jié)果會(huì)被攔截
而瀏覽器免不了要進(jìn)行跨域,訪問(wèn)資源哪有不跨域的闷串,不跨域你只能看自己域里面的東西瓮钥,所以瀏覽器一般是采用第二個(gè)攔截方式筋量,而這種攔截方式烹吵,可能已經(jīng)對(duì)服務(wù)端進(jìn)行了數(shù)據(jù)的操作,為了防止這種情況桨武,首先發(fā)起預(yù)檢請(qǐng)求肋拔,來(lái)檢測(cè)是否能夠發(fā)起真正的請(qǐng)求。(這里能知道呀酸,簡(jiǎn)單請(qǐng)求是沒必要進(jìn)行預(yù)檢的凉蜂,因?yàn)闉g覽器認(rèn)為,簡(jiǎn)單請(qǐng)求是安全的性誉,是被用戶允許的)
預(yù)檢請(qǐng)求預(yù)檢的是url 所以即使是同源的 每個(gè)復(fù)雜請(qǐng)求都會(huì)進(jìn)行預(yù)檢 主要是對(duì)比url和方法
cors請(qǐng)求過(guò)程
首先如果是簡(jiǎn)單請(qǐng)求則在請(qǐng)求頭直接添加orgin字段窿吩,對(duì)于非簡(jiǎn)單請(qǐng)求需要一次預(yù)檢請(qǐng)求options,需要origin字段错览,當(dāng)服務(wù)端通過(guò)預(yù)檢請(qǐng)求會(huì)在響應(yīng)頭攜帶Allow-controll-Access-Origin字段(為*或者是origin的值)纫雁,之后的請(qǐng)求就像簡(jiǎn)單請(qǐng)求一樣,攜帶origin字段倾哺。
請(qǐng)求頭響應(yīng)頭過(guò)程:http://www.reibang.com/p/b6520a7fb386