跨域請(qǐng)求引起的 OPTIONS request

我相信有很多細(xì)心的小伙伴在做項(xiàng)目的過(guò)程中會(huì)發(fā)現(xiàn),明明接口只調(diào)用了一次,為什么 network 中出現(xiàn)了兩次請(qǐng)求?并且第一次請(qǐng)求方法為 OPTIONS ,請(qǐng)求狀態(tài)為200,而返回 body 體為空。而第二次才是正常的請(qǐng)求,這是由什么引起的呢?查了很久的資料,發(fā)現(xiàn)這是由跨域請(qǐng)求引起的跨域預(yù)檢請(qǐng)求。


image.png
image.png

image.png

首先要理解什么是跨域請(qǐng)求(CORS)

跨域請(qǐng)求我已經(jīng)在前幾篇文章中有寫(xiě)到,不明白的小朋友可以先去看看那一篇。

CORS preflight(跨域預(yù)檢請(qǐng)求)

跨域請(qǐng)求分為簡(jiǎn)單請(qǐng)求和復(fù)雜請(qǐng)求兩種。能夠引起預(yù)檢請(qǐng)求的被叫做復(fù)雜請(qǐng)求,反之則為簡(jiǎn)單請(qǐng)求。然而,并不是所有的跨域請(qǐng)求都會(huì)引起預(yù)檢請(qǐng)求的,那么哪些情況能引起此操作呢?

  1. 當(dāng)請(qǐng)求方法包括下面任何一種的時(shí)候
  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE
  • PATCH
  1. 當(dāng)請(qǐng)求中包括除Fetch spec定義為“CORS-safelisted請(qǐng)求報(bào)頭”以外的任何報(bào)頭,如下所示:
  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width
  1. 當(dāng)Content-Type被設(shè)置為除了下面任何一種選項(xiàng)時(shí)
  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain
  1. 當(dāng)XMLHttpRequestUpload對(duì)象上被注冊(cè)一個(gè)或多個(gè)事件偵聽(tīng)器時(shí)
  2. 當(dāng)請(qǐng)求中未使用ReadableStream對(duì)象時(shí)。

跨域請(qǐng)求的一次復(fù)雜請(qǐng)求過(guò)程如圖

image.png

結(jié)論

跨域預(yù)檢請(qǐng)求是瀏覽器和服務(wù)器之間的安全校驗(yàn)操作,屬于正?,F(xiàn)象,現(xiàn)在出現(xiàn)兩次請(qǐng)求的小伙伴可以看看你的請(qǐng)求中是不是出現(xiàn)上述的設(shè)置了呢?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容