全部前端工程師都知道跨域問題(不一樣的協議、域、端口),也都知道解決跨域的常見方式是經過設置cors。 那麼cors究竟是什麼,它是如何解決跨域問題的呢前端
CORS全稱Cross-Origin Resource Sharing,即跨域資源共享。是解決跨域問題常見的方式。api
知足如下條件即視爲簡單請求跨域
請求方法爲如下任意方法之一(在W3C規範中也稱爲簡單方法 simple method)瀏覽器
請求頭只能包含如下字段 (在W3C規範中前4種稱爲簡單頭部 simple header,不包括瀏覽器自動設置的那些,好比User-Agent,Connection等)緩存
對於簡單請求,瀏覽器會直接發起實際跨域請求,只要返回頭部中設置了正確的Access-Control-Allow-Origin
字段便可成功請求,不然你會在瀏覽器的console
面板看到相似於下面這樣報錯cookie
Access to XMLHttpRequest at 'http://domain.com/api/test' from origin 'http://localhost:1234' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
前端工程師
對於非簡單請求,在發起實際的請求以前,瀏覽器會發起一個預檢請求(preflight request),這是個options請求,包含如下字段app
當預檢請求經過後,纔會發起真實的請求,不然你會在瀏覽器的console
面板看到相似於下面這樣報錯(這裏是請求頭沒有經過預檢)cors
Access to XMLHttpRequest at 'http://domain.com/api/test' from origin 'http://localhost:1234' has been blocked by CORS policy: Request header field custom-header is not allowed by Access-Control-Allow-Headers in preflight response.
dom
另外,須要同時對接口的options
方法以及真實的get
或post
方法設置對應的返回頭。若是隻設置了真實請求方法的返回頭,而沒有相應設置options方法的返回頭,預檢也不會經過。你會在瀏覽器的console
面板看到相似於下面這樣報錯
Access to XMLHttpRequest at 'http://domain.com/api/test' from origin 'http://localhost:1234' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
預檢請求是有緩存的!在預檢請求的返回頭中設置Access-Control-Max-Age
字段,值爲int類型,表明過時時間,單位是秒。 在該時間段以內,非簡單方法發送跨域請求不會再事先發起預檢請求。
對於預檢請求,能夠返回下列字段
Access-Control-Allow-Origin
不能爲*
,當該值爲false,同時請求又攜帶了credentials,該請求的返回會被瀏覽器忽略)本文主要知識來源並推薦閱讀: