測試大姐提了個bug,為什麼你多了個options請求?

来源:https://www.cnblogs.com/JavaEdge/archive/2023/09/04/17678349.html
-Advertisement-
Play Games

## 1 下班前的寂靜 剛準備下班呢,測試大姐又給我提個`bug`,你看我這就操作了一次,`network`里咋有兩個請求? 我心一驚,”不可能啊!我代碼明明就調用一次後端介面,咋可能兩個請求!“。打開她的截圖一看:多個`options`請求。 我不慌不忙解釋道:”這不用管,是瀏覽器預設發送的一個預 ...


1 下班前的寂靜

剛準備下班呢,測試大姐又給我提個bug,你看我這就操作了一次,network里咋有兩個請求?

我心一驚,”不可能啊!我代碼明明就調用一次後端介面,咋可能兩個請求!“。打開她的截圖一看:多個options請求。

我不慌不忙解釋道:”這不用管,是瀏覽器預設發送的一個預檢請求“。

可測試大姐好像依舊很執著:“那這可肯定不行啊,明明一次請求,幹嘛要兩次呢,這不是增大服務端壓力嗎?”

“md,真固執啊,那就不下班了,加個鐘給你講懂!”

HTTP請求分為兩種:

  • 簡單請求
  • 非簡單請求

2 簡單請求

2.1 條件

  • 請求方式:HEADGETPOST

  • header中只能包含以下請求頭欄位:

    • Accept

    • Accept-Language

    • Content-Language

    • Content-Type所指的媒體類型值僅僅限於下列三者之一

      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded

2.2 瀏覽器的不同處理方式

簡單請求,若請求跨域,瀏覽器會放行讓請求發出。瀏覽器會發cors請求,並攜帶origin。此時不管服務端返回啥,瀏覽器都會把返回攔截,並檢查返回的responseheader中有無Access-Control-Allow-Origin

  • 這頭部信息的值通常為請求的Origin值,表示允許該來源的請求說明資源是共用的,可以拿到
  • 如果Origin頭部信息的值為"*"(表示允許來自任何來源的請求)但這種情況下需要謹慎使用,因為它存在安全隱患
  • 如沒有這個頭信息,說明服務端沒有開啟資源共用,瀏覽器會認為這次請求失敗終止這次請求,並且報錯。

3 非簡單請求

只要不滿足簡單請求的條件,都是非簡單請求。

發出非簡單cors請求,瀏覽器會做一個http的查詢請求(預檢請求)即optionsoptions請求會按照簡單請求來處理。

為啥要做一次options請求?

檢查伺服器是否支持跨域請求,並確認實際請求的安全性。預檢請求是為保護客戶端的安全,防止不受信任網站利用用戶瀏覽器向其他網站發惡意請求。 預檢請求頭中除了攜帶了origin欄位還包含兩個特殊欄位:

  • Access-Control-Request-Method: 告知伺服器實際請求使用的HTTP方法

  • Access-Control-Request-Headers:告知伺服器實際請求所攜帶的自定義首部欄位

如:

OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

以上報文中就可以看到,使用OPTIONS請求,瀏覽器根據上面的使用的請求參數來決定是否需要發送,這樣伺服器就可以回應是否可以接受用實際的請求參數來發送請求。

-Access-Control-Request-Method告知伺服器,實際請求將使用 POST 方法

Access-Control-Request-Headers告知伺服器,實際請求將攜帶兩個自定義請求標頭欄位:X-PINGOTHERContent-Type。伺服器據此決定,該實際請求是否被允許。

啥時觸發預檢請求?

  1. 發送跨域請求時,請求頭中包含了一些非簡單請求的頭信息,如自定義頭(custom header)
  2. 發送跨域請求時,使用了 PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH等請求方法

“大姐你聽懂了嗎?所以這不是 bug,趕緊把它關掉吧!”

大姐漏出了澄澈的目光,好吧

4 上案例

這下測試大姐終於半信半疑地關閉了Bug。

5 假如世上沒有測試大姐

我說假如啊!你的測試老大姐就是說:我不懂你說的這些,我不管,反正我現在想看到的是在瀏覽器裡面只有一次網路請求,你自己看著辦吧,bug 我留在這了,你自己處理!

愛!瀏覽器廠商為了保證安全性,禁止了跨域,可最終還是程式員承受了所有優化的代價!

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 2023年了,我不允許還有人不會自己實現移動端的雙擊事件。 過來,看這裡,不足 50 行的代碼實現的雙擊事件。 聽筆者娓娓道來。 dblclick js原生有個dblclick雙擊事件,但是幾乎不支持移動端。 而且,該dblclic ...
  • # 開發背景 - 短時間內完成網頁性能統計上傳,考慮到企業內實際環境,很多網頁/系統需要運行在IE 5 相容模式下,開發一個腳本,在不影響原網頁的情況下,收集相應 用戶電腦 打開網頁的性能指標。 # 收集要素 - 進入頁面時間,載入Js時間 - 頁面所有元素載入完成時間 - 因為在原網頁將該腳本放到 ...
  • 需求:在現有已經做好的後臺管理系統添加一個切換主題顏色的功能 分析:該項目用了很多uniapp的組件,css樣式沒有統一,類名也沒有統一 使用混合mixin.scss,並使用vuex 效果圖 功能:按鈕背景顏色、部分樣式、字體圖標、分頁跟隨主題顏色變化也變化 每一個用戶喜歡的主題顏色都不一樣,後端已 ...
  • 在 CSS 中,存在許多數學函數,這些函數能夠通過簡單的計算操作來生成某些屬性值,例如在[現代 CSS 解決方案:CSS 數學函數](https://github.com/chokcoco/iCSS/issues/177)一文中,我們詳細介紹了 + calc():用於計算任意長度、百分比或數值型數據 ...
  • ## 軟體開發原則 | 原則 | 介紹 | | | | | 單一職責原則 | 一個類或模塊應該只負責一項任務或功能 | | 開閉原則 | 軟體實體(類、模塊、函數等)應該對擴展開放,對修改關閉 | | 里氏替換原則 | 子類應該能夠替換其父類並且不會破壞程式的正確性 | | 介面隔離原則 | 客戶端 ...
  • ## 1.1、MVC 概述 - MVC:是一種軟體架構的思想,將軟體按照模型、視圖、控制器來劃分; - M( Model ):模型層,指工程中的 JavaBean ,作用是處理數據; - V( View ):視圖層,指工程中的 html 或 jsp 等頁面,作用是與用戶進行交互、展示數據; - C( ...
  • # 簡介 緩存是程式員們繞不開的話題,像是常用的本地緩存Guava,分散式緩存Redis等,是提供高性能服務的基礎。今天敬姐帶大家一起認識一個更高效的本地緩存——**Caffeine**。 ![img](https://img2023.cnblogs.com/blog/37001/202309/37 ...
  • ## 1、問題描述 - Eclipse導入了一個JavaEE項目 - 在虛擬機環境中新建了一個資料庫 - 資料庫可以使用本地客戶端工具正常連接 - 導入的JavaEE項目修改了數據源配置後無法啟動 - 相同的數據源配置通過在Idea新建的測試項目可以訪問 > 具體報錯如下: ``` java.sql ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...