最近在項目中遇到一個問題概荷,發(fā)送請求時辨图,瀏覽中顯示發(fā)送了兩個請求,一個是OPTIONS精钮,另一個是實際的請求恕齐。然而后臺在處理OPTIONS請求的時候乞娄,對請求進行了攔截,導致實際請求未能進行显歧。所以需要后臺排除下options請求仪或,如下圖
1.OPTIONS請求為何會自動發(fā)起?
MDN的CORS一文中提到:
規(guī)范要求士骤,對那些可能對服務器數(shù)據(jù)產(chǎn)生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求范删,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個預檢請求(preflight request)拷肌,從而獲知服務端是否允許該跨域請求到旦。
瀏覽器將CORS請求分為兩類:簡單請求(simple request)和非簡單請求(not-simple-request),簡單請求瀏覽器不會預檢,而非簡單請求會預檢巨缘。這兩種方式怎么區(qū)分添忘?
2. 跨域請求時,OPTIONS請求觸發(fā)條件
使用了下面任一HTTP 方法:
PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH人為設置了以下集合之外首部字段:
Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/WidthContent-Type 的值不屬于下列之一:
application/x-www-form-urlencoded若锁、multipart/form-data搁骑、text/plain
3. 優(yōu)化OPTIONS請求:Access-Control-Max-Age 或者 避免觸發(fā)
可見一旦達到觸發(fā)條件,跨域請求便會一直發(fā)送2次請求又固,這樣增加的請求數(shù)是否可優(yōu)化呢仲器?答案是可以,OPTIONS預檢請求的結(jié)果可以被緩存仰冠。
Access-Control-Max-Age這個響應首部表示 preflight request (預檢請求)的返回結(jié)果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被緩存的最長時間娄周,單位是秒。(MDN)
如果值為 -1沪停,則表示禁用緩存煤辨,每一次請求都需要提供預檢請求裳涛,即用OPTIONS請求進行檢測。
評論區(qū)的朋友提醒了众辨,盡量避免不要觸發(fā)OPTIONS請求端三,上面例子中把content-type改掉是可以的。在其他場景鹃彻,比如跨域并且業(yè)務有自定義請求頭的話就很難避免了〗即常現(xiàn)在使用的axios或者superagent等第三方ajax插件,如果出現(xiàn)CORS預檢請求蛛株,可以看看默認配置或者二次封裝是否規(guī)范团赁。
參考
https://juejin.cn/post/6844903821634699277
https://segmentfault.com/a/1190000021766588