跨域之OPTION請求【轉載】

哎呦你可棒棒了發表於2024-04-24

一、簡介

出於安全考慮,並不是所有域名訪問後端服務都可以。其實在正式跨域之前,瀏覽器會根據需要發起一次預檢(也就是option請求),用來讓服務端返回允許的方法(如get、post),被跨域訪問的Origin(來源或者域),還有是否需要Credentials(認證資訊)等。那麼瀏覽器在什麼情況下能預檢呢?

二、兩種請求方式

瀏覽器將CORS請求分為兩類:簡單請求(simple request)和非簡單請求(not-simple-request),簡單請求瀏覽器不會預檢,而非簡單請求會預檢。這兩種方式怎麼區分?

同時滿足下列三大條件,就屬於簡單請求,否則屬於非簡單請求

1.請求方式只能是:GET、POST、HEAD

2.HTTP請求頭限制這幾種欄位:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID

3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain

對於簡單請求,瀏覽器直接請求,會在請求頭資訊中,增加一個origin欄位,來說明本次請求來自哪個源(協議+域名+埠)。伺服器根據這個值,來決定是否同意該請求,伺服器返回的響應會多幾個頭資訊欄位,如圖所示:上面的頭資訊中,三個與CORS請求相關,都是以Access-Control-開頭。

1.Access-Control-Allow-Origin:該欄位是必須的,* 表示接受任意域名的請求,還可以指定域名

2.Access-Control-Allow-Credentials:該欄位可選,是個布林值,表示是否可以攜帶cookie,(注意:如果Access-Control-Allow-Origin欄位設定*,此欄位設為true無效)

3.Access-Control-Allow-Headers:該欄位可選,裡面可以獲取Cache-Control、Content-Type、Expires等,如果想要拿到其他欄位,就可以在這個欄位中指定。比如圖中指定的GUAZISSO

非簡單請求是對那種對伺服器有特殊要求的請求,比如請求方式是PUT或者DELETE,或者Content-Type欄位型別是application/json。都會在正式通訊之前,增加一次HTTP請求,稱之為預檢。瀏覽器會先詢問伺服器,當前網頁所在域名是否在伺服器的許可名單之中,伺服器允許之後,瀏覽器會發出正式的XMLHttpRequest請求,否則會報錯。(備註:之前碰到預檢請求後端沒有透過,就不會發正式請求,然後找了好久原因,原來後端給忘了設定...)Java後端實現攔截器,排除Options

就Content-Type為application/json為例:對比兩張圖片,一次預檢請求,一 次正式請求:

預檢請求

正式請求

很明顯,請求頭中預檢請求不會攜帶cookie,正式請求會攜帶cookie和引數。跟普通請求一樣,響應頭也會增加同樣欄位。

一旦伺服器透過了“預檢”請求,以後每次瀏覽器正常的CORS請求,就都跟簡單請求一樣。


注:本文轉載於https://www.jianshu.com/p/5cf82f092201

相關文章