在正式跨域的請求前,瀏覽器會根據需要,發起乙個「preflight」(也就是option請求),用來讓服務端返回允許的方法(如get、post),被跨域訪問的origin(**,或者域),還有是否需要credentials(認證資訊)
三種場景:
如果跨域的請求是****** request(簡單請求 ),則不會觸發「preflight」。mozilla對於簡單請求的要求是:
以下三項必須都成立:
只能是get、head、post方法
除了瀏覽器自己在http頭上加的資訊(如connection、user-agent),開發者只能加這幾個:accept、accept-language、content-type、。。。。
跨域請求中,options請求是瀏覽器自發起的preflight request(預檢請求),以檢測實際請求是否可以被瀏覽器接受。
(1)access-control-request-method:告知伺服器實際請求所使用的http方法;
(2)access-control-request-headers:告知伺服器實際請求所攜帶的自定義首部字段。
同時伺服器也會新增origin header,告知伺服器實際請求的客戶端的位址。伺服器基於從預檢請求獲得的資訊來判斷,是否接受接下來的實際請求。
伺服器所返回的access-control-allow-methods首部欄位將所有允許的請求方法告知客戶端,返回將所有access-control-request-headers首部欄位將所有允許的自定義首部字段告知客戶端。此外,伺服器端可返回access-control-max-age首部字段,允許瀏覽器在指定時間內,無需再傳送預檢請求,直接用本次結果即可。
在我們開發過程**現的瀏覽器自發起的options請求就是上面的第二種情況。實際上,跨域請求中的」複雜請求」發出前會進行一次方法是options的preflight request。
二、當跨域請求是簡單請求時不會進行preflight request,只有複雜請求才會進行preflight request。
跨域請求分兩種:簡單請求、複雜請求;
符合以下任一情況的就是複雜請求:
1.使用方法put或者delete;
3.請求中帶有自定義頭部;
除了滿足以上條件的複雜請求其他的就是簡單請求嘍!
三、為什麼跨域的複雜請求需要preflight request?
複雜請求可能對伺服器資料產生***。例如delete或者put,都會對伺服器資料進行修改,所以在請求之前都要先詢問伺服器,當前網頁所在網域名稱是否在伺服器的許可名單中,伺服器允許後,瀏覽器才會發出正式的請求,否則不傳送正式請求。
前後端分離跨域問題
access to xmlhttprequest at localhost 8081 user gettoken?username hyly password hyly from origin http localhost 63342 has been blocked by cors policy ...
前後端分離跨域問題
public class loginhandlerinterceptor implements handlerinterceptor response.sendredirect request.getcontextpath login.html catch ioexception e return ...
前後端分離跨域問題總結
跨域問題一般是後端處理,前端只需要在請求時追加,一般就能解決跨域問題。後端 新增corsfilter過濾器,實現filter介面 跨域請求配置 override public void dofilter servletrequest servletrequest,servletresponse se...