CORS就是跨域嗎?

来源:https://www.cnblogs.com/cosimo/p/18023596
-Advertisement-
Play Games

首先,跨域的域是什麼? 跨域的英文是:Cross-Origin。 Origin 中文含義為:起源,源頭,出生地。 在跨域中,"域"指的是一個 Web 資源(比如網頁、腳本、圖片等)的源頭。 包括該資源的協議、主機名、埠號。 在同源策略中,如果兩個資源的域相同,則它們屬於同一域,可以自由進行交互和共 ...


首先,跨域的域是什麼?

跨域的英文是:Cross-Origin。

Origin 中文含義為:起源,源頭,出生地。

在跨域中,"域"指的是一個 Web 資源(比如網頁、腳本、圖片等)的源頭

包括該資源的協議主機名埠號

同源策略中,如果兩個資源的域相同,則它們屬於同一域,可以自由進行交互和共用數據。

反之,如果兩個資源的域不同,就會出現跨域問題

這時就需要特殊的方式來處理,如跨域資源共用(CORS)

那什麼是同源策略?

同源策略(Same-Origin Policy)是瀏覽器中的一項安全機制,用於保護用戶的隱私和安全。

它限制了一個網頁或者腳本只能從同一個源載入的資源進行訪問,而不能訪問其他來源的資源。

這樣做可以防止惡意網站利用用戶身份信息進行跨站請求偽造(CSRF)攻擊,保護用戶的數據安全。

什麼是跨站請求偽造?

跨站請求偽造(CSRF,Cross-Site Request Forgery)是一種網路攻擊方式。

在 CSRF 攻擊中,攻擊者利用已認證的用戶身份(例如用戶在銀行網站上登錄後的會話信息)來偽造請求,以執行未經授權的操作。

舉個例子:

我登錄了銀行網站,瀏覽器根據我的登錄信息生成了一個會話令牌,也就是 session token。

但是這個令牌被而惡意網站給拿到了,它拿著我的 token 去伺服器發送請求。

就可以把我銀行卡裡的 29 塊八毛五全部轉走。

但是如果有同源策略的限制,惡意網站就無法直接發送請求到銀行。

我的 29 塊八毛五就可以保住。

因為惡意網站的功能變數名稱與銀行網站的功能變數名稱不同,瀏覽器會阻止這種搶劫行為。

什麼是跨域資源共用(CORS)?

為了防止被面試官笑話,這裡一定要知道:

跨域資源共用(CORS,Cross-Origin Resource Sharing)是一種用來解決由於瀏覽器的同源策略而導致的跨域請求問題的一種機制。

瀏覽器將 CORS 請求分成兩類:

簡單請求(simple request)和非簡單請求(not-so-simple request)。

什麼是簡單請求?

只要同時滿足以下兩大條件,就屬於簡單請求。

(1)請求方法是以下三種方法之一:
- HEAD
- GET
- POST

(2)HTTP的頭信息不超出以下幾種欄位:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限於三個值:application/x-www-form-urlencoded、multipart/form-data、text/plain

簡單請求的工作流程如下:

1. 瀏覽器在請求中增加一個 Origin 頭部欄位,其中包含當前頁面的源信息(協議、主機、埠)。

2. 伺服器在收到這個請求後,會根據請求中的 Origin 頭部信息來判斷是否允許該請求。

3. 如果伺服器允許該請求,會在響應頭部中包含一個 Access-Control-Allow-Origin 頭部,"*"表示允許所有來源。

4. 瀏覽器在收到響應後,決定是否允許頁面訪問該資源。

什麼是非簡單請求?

不是簡單請求的,就是非簡單請求。

非簡單請求它非簡單在哪?

或者說:

它非簡單又能怎麼樣?

非簡單請求在發起正式請求之前,會先發起一個預檢請求

什麼是預檢請求?

預檢請求是用於在實際的跨域請求之前進行探測和驗證,以確保伺服器能夠正確處理,預防跨域請求可能會引發的安全性問題。

一句話就是:

我去前面探探路!

只有得到伺服器的肯定答覆,瀏覽器才會發出正式的 XMLHttpRequest 請求,否則就報錯。


實際 java 開發中的 CORS 解決跨域配置長這樣:

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 允許所有的URL路徑都可以跨域訪問
        registry.addMapping("/**")
            // 允許所有來源(即允許任何功能變數名稱)的請求跨域訪問
            .allowedOrigins("*")
            // 允許發送身份驗證信息(如cookies、HTTP身份驗證或客戶端SSL證明)
            .allowCredentials(true)
            // 允許跨域請求的HTTP方法,包括GET、POST、PUT、DELETE和OPTIONS。
            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
            // 預檢請求(OPTIONS請求)的有效期,單位為秒
            .maxAge(3600);
    }
}

還有別的方式可以解決跨域問題嗎?

有的。

使用 Nginx 部署為同一域。

什麼意思呢?

就是說 Nginx 作為唯一域,代理所有服務端,在客戶端眼裡,只有 Nginx 這一個域,也就不存在跨域問題,由 Nginx 拿到請求再分發給對應伺服器。

這裡我們就不再展開。


往期推薦:

● 師爺,翻譯翻譯什麼叫AOP

翻譯,師爺師爺什麼叫事務

紀念JDBC

● SpringBoot實現動態數據源配置

● 聚簇索引、回表與覆蓋索引

Java鎖到底是個什麼東西


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

-Advertisement-
Play Games
更多相關文章
  • 簡介 簡單工廠模式又稱為靜態工廠模式,屬於創建型模式,但不屬於GOF23設計模式。由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類。 簡單工廠適用場景:工廠類負責創建的對象比較少;客戶端只需要知道傳入工廠類的參數,對於如何創建對 ...
  • 一、總結 1.1、使用System.currentTimeMillis();計算程式執行毫秒數 // 開始時間1 long startTime1 = System.currentTimeMillis(); Thread.sleep(100); // 結束時間1 long endTime1 = Sys ...
  • 日常工作中,數據開發上線完一個任務後並不是就可以高枕無憂,時常因上游鏈路數據異常或者自身處理邏輯的 BUG 導致產出的數據結果不可信。而問題發現可經歷較長周期(尤其離線場景),往往是業務方通過上層數據報表發現數據異常後 push 數據方去定位問題(對於一個較冷的報表,這個周期可能會更長)。 由於數據 ...
  • Java 面向對象編程 面向對象編程 (OOP) 是一種編程範式,它將程式組織成對象。對象包含數據和操作數據的方法。 OOP 的優勢: 更快、更易於執行 提供清晰的結構 代碼更易於維護、修改和調試 提高代碼重用性 減少開發時間 類和對象 類 是對象的模板,它定義了對象的屬性和方法。 對象 是類的實例 ...
  • Miniconda是Anaconda的簡化版, 可以管理多個Python版本的環境. 實際使用的話, 占用的空間不會很小, 我跑一些正常的應用後, 安裝目錄占用空間4.3GB, 安裝建議要預留10到20G的空間. 安裝 Miniconda 下載安裝包 https://docs.anaconda.co ...
  • 美團面試:Kafka如何處理百萬級消息隊列? 在今天的大數據時代,處理海量數據已成為各行各業的標配。特別是在消息隊列領域,Apache Kafka 作為一個分散式流處理平臺,因其高吞吐量、可擴展性、容錯性以及低延遲的特性而廣受歡迎。但當面對真正的百萬級甚至更高量級的消息處理時,如何有效地利用 Kaf ...
  • 摘要 我們報告了 GPT-4 的開發,這是一個大規模、多模態的模型,可以接受圖像和文本輸入,並生成文本輸出。雖然在許多現實場景中不如人類,但 GPT-4 在各種專業和學術基準測試中表現出與人類水平相當的性能,包括在模擬的律師資格考試中取得了約前10%的考生得分。 GPT-4 是基於 Transfor ...
  • 虛擬線程(Virtual Threads)是 Java 21 所有新特性中最為吸引人的內容,它可以大大來簡化和增強Java應用的併發性。但是,隨著這些變化而來的是如何最好地管理此吞吐量的問題。本文,就讓我們看一下開發人員在使用虛擬線程時,應該如何管理吞吐量。 在大多數情況下,開發人員不需要自己創建虛 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...