測試大姐提了個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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...