【前端跨域】CORS:跨域資源共享的機制與實現

在現代Web開發中,跨域資源共享(Cross-Origin Resource Sharing,簡稱CORS)是一種非常重要的技術,用于解決瀏覽器跨域請求的限制

CORS允許服務器明確指定哪些外部源可以訪問其資源,從而在保證安全的前提下實現跨域通信
本文將詳細介紹CORS的工作原理、實現方式以及如何在實際開發中使用它

什么是CORS?

CORS是一種W3C標準,旨在解決瀏覽器跨域請求的限制

它通過在HTTP請求和響應中添加特定的頭部信息,允許服務器聲明哪些外部源可以訪問其資源

CORS的核心思想是:服務器通過設置響應頭來告訴瀏覽器,哪些跨域請求是被允許的

為什么需要CORS?

在Web開發中,前端應用通常需要從不同的源(域名、協議或端口)獲取資源。例如,一個前端應用可能需要從API服務器獲取數據,或者從CDN加載靜態資源。然而,瀏覽器的同源策略(Same-Origin Policy)會阻止這些跨域請求,除非目標服務器明確允許

CORS提供了一種機制,使得服務器可以明確聲明哪些外部源可以訪問其資源,從而在保證安全的前提下實現跨域通信

工作原理

CORS的工作原理可以分為以下幾個步驟:

簡單請求(Simple Request)

對于某些簡單的HTTP請求(如GET、POST,且請求頭為特定類型),瀏覽器會直接發送請求,并在請求頭中添加Origin字段,表示請求的來源

服務器收到請求后,會檢查Origin字段,并在響應頭中添加Access-Control-Allow-Origin字段,表示允許的源

如果服務器允許該源訪問資源,瀏覽器就會正常處理響應

預檢請求(Preflight Request)

對于某些復雜的HTTP請求(如PUT、DELETE,或帶有自定義請求頭的請求),瀏覽器會先發送一個預檢請求(OPTIONS請求),以確認服務器是否允許該跨域請求

預檢請求的請求頭中包含OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段。服務器收到預檢請求后,會檢查這些字段,并在響應頭中添加Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers字段,表示允許的源、方法和請求頭

如果服務器允許該跨域請求,瀏覽器才會發送實際的請求。

帶憑證的請求(Credentialed Request)

如果跨域請求需要攜帶憑證(如Cookies、HTTP認證信息等),瀏覽器會在請求頭中添加Credentials字段

服務器需要在響應頭中添加Access-Control-Allow-Credentials: true字段,表示允許帶憑證的請求

實現

在實際開發中,CORS的實現主要依賴于服務器端的配置。以下是一些常見的服務器端配置示例:

允許所有源訪問:Access-Control-Allow-Origin: *
這種配置允許所有外部源訪問資源,適用于公開的API

允許特定源訪問:Access-Control-Allow-Origin: https://example.com
這種配置只允許特定的外部源訪問資源,適用于需要限制訪問的場景

允許帶憑證的請求:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
這種配置允許特定的外部源訪問資源,并且允許帶憑證的請求

允許特定的HTTP方法和請求頭:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
這種配置允許特定的HTTP方法和請求頭,適用于復雜的跨域請求

實際應用

在實際開發中,CORS的實現通常依賴于后端框架或中間件。以下是一些常見后端框架的CORS配置示例:

提供了三種語言的實現方式:node.js、python 和 java

Node.js(Express框架)

const express = require('express');
const cors = require('cors');
const app = express();app.use(cors({origin: 'https://example.com',credentials: true,methods: ['GET', 'POST', 'PUT', 'DELETE'],allowedHeaders: ['Content-Type', 'Authorization']
}));app.get('/data', (req, res) => {res.json({ message: 'Hello, CORS!' });
});app.listen(3000, () => {console.log('Server is running on port 3000');
});

Python(Django框架)

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from corsheaders.middleware import CorsMiddleware@csrf_exempt
@require_http_methods(["GET", "POST", "PUT", "DELETE"])
def data(request):response = JsonResponse({'message': 'Hello, CORS!'})response['Access-Control-Allow-Origin'] = 'https://example.com'response['Access-Control-Allow-Credentials'] = 'true'return response

Java(Spring Boot框架)

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@CrossOrigin(origins = "https://example.com", allowCredentials = "true", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})
public class DataController {@GetMapping("/data")public String data() {return "Hello, CORS!";}
}

總結

CORS是一種強大的跨域資源共享機制,通過服務器端的配置,可以有效地解決瀏覽器跨域請求的限制

本文詳細介紹了CORS的工作原理、實現方式以及在實際開發中使用

通過合理配置CORS,我們可以在保證安全的前提下實現跨域通信,從而構建更加靈活和強大的Web應用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896964.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【設計模式】單例模式|餓漢模式|懶漢模式|指令重排序

目錄 1.什么是單例模式? 2.如何保證單例? 3.兩種寫法 (1)餓漢模式(早創建) (2)懶漢模式(緩執行,可能不執行) 4.應用場景 🔥5.多…

RocketMQ順序消費機制

RocketMQ的順序消費機制通過生產端和消費端的協同設計實現,其核心在于局部順序性,即保證同一隊列(MessageQueue)內的消息嚴格按發送順序消費。以下是詳細機制解析及關鍵源碼實現: 一、順序消費的核心機制 1. 生產端路…

【JavaEE】-- 多線程(初階)4

文章目錄 8.多線程案例8.1 單例模式8.1.1 餓漢模式8.1.2 懶漢模式 8.2 阻塞隊列8.2.1 什么是阻塞隊列8.2.2 生產者消費者模型8.2.3 標準庫中的阻塞隊列8.2.4 阻塞隊列的應用場景8.2.4.1 消息隊列 8.2.5 異步操作8.2.5 自定義實現阻塞隊列8.2.6 阻塞隊列--生產者消費者模型 8.3 …

【C++設計模式】第四篇:建造者模式(Builder)

注意:復現代碼時,確保 VS2022 使用 C17/20 標準以支持現代特性。 分步驟構造復雜對象,實現靈活裝配 1. 模式定義與用途 核心目標:將復雜對象的構建過程分離,使得同樣的構建步驟可以創建不同的表示形式。 常見場景&am…

vuex中的state是響應式的嗎?

在 Vue.js 中,Vuex 的 state 是響應式的。這意味著當你更改 state 中的數據時,依賴于這些數據的 Vue 組件會自動更新。這是通過 Vue 的響應式系統實現的,該系統使用了 ES6 的 Proxy 對象來監聽數據的變化。 當你在 Vuex 中定義了一個 state …

若依框架中的崗位與角色詳解

若依框架中的崗位與角色詳解 一、核心概念與定位 崗位(Post) 業務職能導向:崗位是用戶在組織架構中的職務標識(如“開發人員”“項目經理”),用于描述工作職責而非直接控制權限。崗位與部門關聯&#xff…

SQL經典常用查詢語句

1. 基礎查詢語句 1.1 查詢表中所有數據 在SQL中,查詢表中所有數據是最基本的操作之一。通過使用SELECT * FROM table_name;語句,可以獲取指定表中的所有記錄和列。例如,假設有一個名為employees的表,包含員工的基本信息&#xf…

EP 架構:未來主流方向還是特定場景最優解?

DeepSeek MoE架構采用跨節點專家并行(EP)架構,在提升推理系統性能方面展現出巨大潛力。這一架構在發展進程中也面臨諸多挑戰,其未來究竟是會成為行業的主流方向,還是僅適用于特定場景,成為特定領域的最優解…

[密碼學實戰]Java實現國密(SM2)密鑰協商詳解:原理、代碼與實踐

一、代碼運行結果 二、國密算法與密鑰協商背景 2.1 什么是國密算法? 國密算法是由中國國家密碼管理局制定的商用密碼標準,包括: SM2:橢圓曲線公鑰密碼算法(非對稱加密/簽名/密鑰協商)SM3:密碼…

動漫短劇開發公司,短劇小程序搭建快速上線

在當今快節奏的生活里,人們的娛樂方式愈發多元,而動漫短劇作為新興娛樂形式,正以獨特魅力迅速崛起,成為娛樂市場的耀眼新星。近年來,動漫短劇市場呈爆發式增長,吸引眾多創作者與觀眾目光。 從市場規模來看…

第四十五:創建一個vue 的程序

html <div id"app">{{ msg }}<h2>{{ web.title }}</h2><h3>{{ web.url }}</h3> </div> js /*<div id"app"></div> 指定一個 id 為 app 的 div 元素{{ }} 插值表達式, 可以將 Vue 實例中定義的數據在視圖…

docer swarm集群部署springboot項目

1.準備兩臺服務器&#xff0c;安裝好docker、docker-compose 因為用到了docker倉庫&#xff0c;安裝harbor,可以從github下載離線安裝包 2. 我這邊用到了gitlab-ci,整體流程也都差不多 1&#xff09;打包mvn clean install 2&#xff09;打鏡像 docker-compose -f docker-compo…

Python測試框架Pytest的參數化

上篇博文介紹過&#xff0c;Pytest是目前比較成熟功能齊全的測試框架&#xff0c;使用率肯定也不斷攀升。 在實際工作中&#xff0c;許多測試用例都是類似的重復&#xff0c;一個個寫最后代碼會顯得很冗余。這里&#xff0c;我們來了解一下pytest.mark.parametrize裝飾器&…

開發博客系統

前言 準備工作 數據庫表分為實體表和關系表 第一&#xff0c;建數據庫表 然后導入前端頁面 創建公共模塊 就是統一返回值&#xff0c;異常那些東西 自己造一個自定義異常 普通類 mapper 獲取全部博客 我們只需要返回id&#xff0c;title&#xff0c;content&#xff0c;us…

【Spring Boot 應用開發】-05 命令行參數

Spring Boot 常用命令行參數 Spring Boot 支持多種命令行參數&#xff0c;這些參數可以在啟動應用時通過命令行直接傳遞。以下是一些常用的命令行參數及其詳細說明&#xff1a; 1. 基本配置參數 --server.port端口號 指定應用程序運行的HTTP端口&#xff0c;默認為8080。 jav…

20250304學習記錄

第一部分&#xff0c;先來了解一下各種論文期刊吧&#xff0c;畢竟也是這把歲數了&#xff0c;還什么都不懂呢 國際期刊&#xff1a; EI收集的主要有兩種&#xff0c; JA&#xff1a;EI源刊 CA&#xff1a;EI會議 CPCI也叫 ISTP 常說的SCI分區是指&#xff0c;JCR的一區、…

2024 年 MySQL 8.0.40 安裝配置、Workbench漢化教程最簡易(保姆級)

首先到官網上下載安裝包&#xff1a;http://www.mysql.com 點擊下載&#xff0c;拉到最下面&#xff0c;點擊社區版下載 windows用戶點擊下面適用于windows的安裝程序 點擊下載&#xff0c;網絡條件好可以點第一個&#xff0c;怕下著下著斷了點第二個離線下載 雙擊下載好的安裝…

網絡安全檢查漏洞內容回復 網絡安全的漏洞

網絡安全的核心目標是保障業務系統的可持續性和數據的安全性&#xff0c;而這兩點的主要威脅來自于蠕蟲的暴發、黑客的攻擊、拒絕服務攻擊、木馬。蠕蟲、黑客攻擊問題都和漏洞緊密聯系在一起&#xff0c;一旦有重大安全漏洞出現&#xff0c;整個互聯網就會面臨一次重大挑戰。雖…

汽車智能鑰匙中PKE低頻天線的作用

PKE&#xff08;Passive Keyless Entry&#xff09;即被動式無鑰匙進入系統&#xff0c;汽車智能鑰匙中PKE低頻天線在現代汽車的智能功能和安全保障方面發揮著關鍵作用&#xff0c;以下是其具體作用&#xff1a; 信號交互與身份認證 低頻信號接收&#xff1a;當車主靠近車輛時…

uiautomatorviewer定位元素報Unexpected ... UI hierarchy

發現問題 借鑒博客 Unexpected error while obtaining UI hierarchy android app UI自動化-元素定位輔助工具 Unexpected error while obtaining UI hierarchy&#xff1a;使用uiautomatorviewer定位元素報錯 最近在做安卓自動化,安卓自動化主要工作之一就是獲取UI樹 app端獲…