前端跨域解決方案(3):CORS

1 CORS 核心

CORS(Cross-Origin Resource Sharing),即跨域資源共享,是目前最主流的跨域方案,它通過服務器返回的特殊 HTTP 頭,允許瀏覽器放行跨域請求。與傳統的 JSONP 相比,CORS 具有明顯的優勢:

  • 支持所有 HTTP 方法(GET/POST/PUT/DELETE 等)

  • 更安全可控的權限管理

  • 完整的錯誤處理機制

  • 支持攜帶 Cookie 等認證信息

1.1?跨域請求的核心流程

當瀏覽器發起跨域請求時,會執行一個關鍵的 "預檢" 流程(Preflight):

  1. 瀏覽器先發送一個 OPTIONS 方法的預檢請求

  2. 服務器返回包含 CORS 相關頭部的響應

  3. 瀏覽器根據響應頭決定是否允許實際請求

這個過程就像是客戶端和服務器之間的一次 "握手",確保雙方就跨域訪問的權限達成一致。

1.2 CORS 核心 HTTP 頭詳解

服務器通過以下關鍵響應頭來控制 CORS 權限:

響應頭字段

作用描述

示例

Access-Control-Allow-Origin

指定允許跨域請求的源(如https://example.com),若設為?*?則允許所有源。

Access-Control-Allow-Origin:?https://example.com

Access-Control-Allow-Methods

列出服務器支持的跨域請求方法(如GET, POST, PUT)。

Access-Control-Allow-Methods: GET, POST, PUT

Access-Control-Allow-Headers

聲明請求中允許攜帶的自定義頭部字段(如Content-Type)。多個頭以逗號分隔。

Access-Control-Allow-Headers: X-My-Custom-Header, Content-Type

Access-Control-Max-Age

設定預檢請求結果的緩存時間(單位:秒),避免頻繁發送 OPTIONS 請求。

Access-Control-Max-Age: 86400

Access-Control-Allow-Credentials

若值為true,允許請求攜帶 Cookie 等憑證,但此時Access-Control-Allow-Origin不可設為*

Access-Control-Allow-Credentials: true

Access-Control-Expose-Headers

指定瀏覽器可以訪問的服務器的響應頭列表。多個頭以逗號分隔。

Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header

2 實戰案例

2.1 GET 請求跨域

場景說明:

  • 服務端 A:運行在 3000 端口,提供靜態頁面

  • 服務端 B:運行在 4000 端口,提供 API 接口

2.1.1 服務端A(servera.js)

// 引入 Express 框架 - 這是一個用于構建 Web 應用和 API 的 Node.js 框架
const express = require('express');// 創建一個 Express 應用實例 - 這將作為我們 Web 服務器的基礎
const app = express();// 設置靜態文件夾 - 所有位于 'public' 目錄下的文件將直接作為靜態資源提供
// 例如,public/index.html 可以通過 http://localhost:3000/index.html 訪問
app.use(express.static('public'));// 定義監聽端口 - 服務器將在這個端口上接收客戶端的請求
const port = 3000;// 讓應用監聽在指定端口并在控制臺輸出信息
// 當服務器成功啟動后,會執行回調函數中的代碼
app.listen(port, () => {// 在控制臺打印服務器運行信息,包含訪問地址console.log(`Server is running on http://localhost:${port}`);
});

2.1.2 靜態頁面A(indext.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>a</title>
</head>
<body><script>// 定義一個立即執行的異步函數 - 這種模式允許我們使用 await 而不需要單獨定義函數(async function () {try {// 使用 fetch API 發送 GET 請求到跨域API - 這是現代瀏覽器提供的原生 AJAX 方法const response = await fetch('http://localhost:4000/users', {// 指定請求方法為 GET - 表示我們正在請求資源method: 'GET',// 指定請求頭,表明期望的響應格式為 JSON - 告訴服務器我們希望收到 JSON 格式的數據headers: {'Accept': 'application/json'}// 使用 then 方法將響應對象轉換為 JSON 格式 - fetch 的第一階段返回的是響應元數據,需要解析 body}).then(response => {// 打印響應頭信息 - 這有助于調試服務器返回的額外信息for (let [key, value] of response.headers) {console.log(`${key}: ${value}`);}// 特別打印內容類型 - 確認服務器返回的數據格式console.log(response.headers.get('content-type'));// 將響應體解析為 JSON 格式 - 返回的是一個 Promisereturn response.json();})// 打印獲取到的響應 - 這里的 response 已經是解析后的 JSON 數據console.log('response ',response);} catch (error) {// 如果有任何錯誤,打印錯誤信息 - 捕獲網絡錯誤或解析錯誤console.error('Error:', error);}// 立即執行上述定義的函數})();</script>
</body>
</html>

2.1.3 服務端B(serverb.js)

// 引入 Express 框架 - 用于構建 Web 服務器和 API 的 Node.js 框架
const express = require('express');// 創建一個 Express 應用實例 - 作為服務器的基礎
const app = express();// 使用中間件來設置響應頭,以處理跨域問題 - 允許不同源的客戶端訪問此 API
app.use((req, res, next) => {// 允許所有來源的訪問 - 生產環境中應限制為特定域名res.header("Access-Control-Allow-Origin", "*"); // 允許接受的請求頭 - 告訴瀏覽器允許客戶端在請求中包含這些頭res.header("Access-Control-Allow-Headers", "Accept");// 指定對外暴露的響應頭 - 允許客戶端訪問這些非標準響應頭res.header('Access-Control-Expose-Headers', 'X-My-Custom-Header'); // 設置自定義的響應頭 - 可用于傳遞額外信息給客戶端res.setHeader('X-My-Custom-Header', 'X-My-Custom-Header');// 調用 next 函數,以便將控制權交給下一個中間件 - 確保請求繼續被處理next();
});// 定義一個用戶列表 - 模擬數據庫中的用戶數據
const users = [{id: 1, name: '用戶1'}
];// 創建一個端點,返回用戶列表 - 處理客戶端對 /users 路徑的 GET 請求
app.get('/users', (req, res) => {// 將用戶列表以 JSON 格式返回 - 設置正確的 Content-Type 并發送數據res.json(users);
});// 定義監聽端口 - 服務器將在此端口接收客戶端請求
const port = 4000;// 讓應用監聽在指定端口并在控制臺輸出信息 - 啟動服務器
app.listen(port, () => {// 當服務器開始運行時,打印一條消息 - 指示服務器已成功啟動console.log(`Server is running on http://localhost:${port}`);
});

2.2 POST 請求跨域

2.2.1 關鍵配置:Access-Control-Max-Age

在處理復雜請求(如 POST)時,Access-Control-Max-Age?頭非常重要,它可以緩存預檢請求的結果,減少不必要的 OPTIONS 請求:

//設置預檢請求結果緩存1小時(3600秒)
res.header("Access-Control-Max-Age", "3600");

2.2.2 靜態頁面A(add.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>a</title>
</head>
<body><script>// 定義一個立即執行的異步函數 - 允許使用 await 語法處理 Promise(async function () {try {// 使用 fetch API 發送 POST 請求到指定的 URL - 用于向服務器提交數據const response = await fetch('http://localhost:4000/users', {// 指定請求方法為 POST - 表示我們正在向服務器提交數據method: 'POST',// 指定請求頭 - 設置內容類型為 JSON 并期望 JSON 響應headers: {'Content-Type': 'application/json',  // 告訴服務器請求體是 JSON 格式'Accept': 'application/json'        // 告訴服務器期望 JSON 格式的響應},// 請求體 - 將 JavaScript 對象轉換為 JSON 字符串發送body: JSON.stringify({name: '李四'})// 使用 then 方法將響應對象轉換為 JSON 格式 - 解析服務器返回的數據}).then(response => response.json())// 打印獲取到的響應 - 這里的 response 是服務器返回的 JSON 數據console.log('response ', response);} catch (error) {// 如果有任何錯誤,打印錯誤信息 - 捕獲網絡錯誤或解析錯誤console.error('Error:', error);}// 立即執行上述定義的函數})();</script>
</body>
</html>

2.2.3 服務端B(serverb.js)

// 引入 Express 框架 - 用于構建 Web 服務器和 API 的 Node.js 框架
const express = require('express');// 創建一個 Express 應用實例 - 作為服務器的基礎
const app = express();// 設置靜態文件夾 - 用于提供靜態資源(如 HTML、CSS、JS 文件)
app.use(express.static('public'));// 使用中間件來解析請求體中的 JSON 數據 - 使 req.body 可以獲取 JSON 格式數據
app.use(express.json());// 使用中間件來解析請求體中的 urlencoded 數據 - 處理表單提交數據
app.use(express.urlencoded({ extended: false }));// 使用中間件來設置響應頭,以處理跨域問題 - 允許不同源的客戶端訪問此 API
app.use((req, res, next) => {// 允許所有來源的訪問 - 生產環境中應限制為特定域名res.header("Access-Control-Allow-Origin", "*"); // 允許接受的請求頭 - 更新為同時允許 Accept 和 Content-Type 頭res.header("Access-Control-Allow-Headers", "Accept,Content-Type");// 指定對外暴露的響應頭 - 允許客戶端訪問這些非標準響應頭res.header('Access-Control-Expose-Headers', 'X-My-Custom-Header'); // 設置自定義的響應頭 - 可用于傳遞額外信息給客戶端res.setHeader('X-My-Custom-Header', 'X-My-Custom-Header');// 設置預檢請求的結果可以被緩存多久 - 減少 OPTIONS 請求的頻率res.header("Access-Control-Max-Age", "3600");// 處理預檢請求(HTTP OPTIONS) - 對于復雜請求,瀏覽器會先發 OPTIONS 請求if (req.method === 'OPTIONS') {// 直接返回 200 狀態碼,結束預檢請求處理return res.sendStatus(200);}// 調用 next 函數,以便將控制權交給下一個中間件 - 確保請求繼續被處理next();
});// 定義一個用戶列表 - 模擬數據庫中的用戶數據
const users = [{id: 1, name: '張三'}
];// 創建一個端點,返回用戶列表 - 處理客戶端對 /users 路徑的 GET 請求
app.get('/users', (req, res) => {// 將用戶列表以 JSON 格式返回 - 設置正確的 Content-Type 并發送數據res.json(users);
});// 創建一個端點,處理添加用戶請求 - 處理客戶端對 /users 路徑的 POST 請求
app.post('/users', (req, res) => {// 從請求體中獲取新用戶數據const user = req.body;// 為新用戶生成唯一 ID(基于當前最后一個用戶的 ID)user.id = users[users.length - 1].id + 1;// 將新用戶添加到用戶列表users.push(user);// 返回更新后的用戶列表 - 通常創建成功返回 201 狀態碼和新資源res.json(users);
});// 定義監聽端口 - 服務器將在此端口接收客戶端請求
const port = 4000;// 讓應用監聽在指定端口并在控制臺輸出信息 - 啟動服務器
app.listen(port, () => {// 當服務器開始運行時,打印一條消息 - 指示服務器已成功啟動console.log(`Server is running on http://localhost:${port}`);
});

2.3 攜帶Cookie的跨域請求

關鍵概念

  • Cookie:服務器存儲在客戶端的小段數據,用于跟蹤用戶狀態(如登錄信息)

  • 跨域限制:默認情況下,瀏覽器不會在跨域請求中攜帶 Cookie

  • CORS 與 Cookie 的結合:需服務端與客戶端同時配置

關鍵細節

  1. 服務端必須

    • 設置?Access-Control-Allow-Origin?為具體域名(非*

    • 添加?Access-Control-Allow-Credentials: true

    • 使用?res.cookie()?方法設置 Cookie

  2. 客戶端必須

    • 在請求中添加?credentials: 'include'

  3. 安全注意事項

    • 建議使用?httpOnly: true?防止 XSS 攻擊

    • 生產環境中配合 HTTPS 使用,確保 Cookie 加密傳輸

2.3.1 服務端B(serverb.js)

// 引入 Express 框架 - 用于構建 Web 服務器和 API 的 Node.js 框架
const express = require('express');// 引入 cookie-parser 中間件,用于處理 Cookie - 解析請求中的 cookie 數據
const cookieParser = require('cookie-parser');// 創建一個 Express 應用實例 - 作為服務器的基礎
const app = express();// 設置靜態文件夾 - 用于提供靜態資源(如 HTML、CSS、JS 文件)
app.use(express.static('public'));// 使用 cookie-parser 中間件 - 使 req.cookies 可以獲取客戶端發送的 cookie
app.use(cookieParser());// 使用中間件來解析請求體中的 JSON 數據 - 使 req.body 可以獲取 JSON 格式數據
app.use(express.json());// 使用中間件來解析請求體中的 urlencoded 數據 - 處理表單提交數據
app.use(express.urlencoded({ extended: false }));// 使用中間件來設置響應頭,以處理跨域問題 - 允許不同源的客戶端訪問此 API
app.use((req, res, next) => {// 允許所有來源的訪問 - 修改為動態允許當前請求的來源(支持帶憑證的 CORS)res.header("Access-Control-Allow-Origin", req.headers.origin); // 允許接受的請求頭 - 包括 Accept 和 Content-Typeres.header("Access-Control-Allow-Headers", "Accept,Content-Type");// 指定對外暴露的響應頭 - 允許客戶端訪問這些非標準響應頭res.header('Access-Control-Expose-Headers', 'X-My-Custom-Header'); // 設置自定義的響應頭 - 可用于傳遞額外信息給客戶端res.setHeader('X-My-Custom-Header', 'X-My-Custom-Header');// 設置預檢請求的結果可以被緩存多久 - 減少 OPTIONS 請求的頻率res.header("Access-Control-Max-Age", "3600");// 允許發送 Cookie - 啟用跨域請求中的 cookie 支持res.header("Access-Control-Allow-Credentials", "true");// 處理預檢請求(HTTP OPTIONS) - 對于復雜請求,瀏覽器會先發 OPTIONS 請求if (req.method === 'OPTIONS') {// 直接返回 200 狀態碼,結束預檢請求處理return res.sendStatus(200);}// 調用 next 函數,以便將控制權交給下一個中間件 - 確保請求繼續被處理next();
});// 定義一個用戶列表 - 模擬數據庫中的用戶數據
const users = [{id: 1, name: '張三'}
];// 創建一個端點,返回用戶列表 - 處理客戶端對 /users 路徑的 GET 請求
app.get('/users', (req, res) => {// 將用戶列表以 JSON 格式返回 - 設置正確的 Content-Type 并發送數據res.json(users);
});// 創建一個端點,處理添加用戶請求 - 處理客戶端對 /users 路徑的 POST 請求
app.post('/users', (req, res) => {// 從請求體中獲取新用戶數據const user = req.body;// 為新用戶生成唯一 ID(基于當前最后一個用戶的 ID)user.id = users[users.length - 1].id + 1;// 將新用戶添加到用戶列表users.push(user);// 返回更新后的用戶列表res.json(users);
});// 創建一個路由,用于計數 - 演示 cookie 的使用
app.get('/count', (req, res) => {// 從請求的 Cookies 中獲取 "count" 的值,如果不存在,則默認為 0let count = req.cookies.count || 0;// 將計數器的值加 1count++;// 在響應的 Cookies 中設置 "count" 的值// 同時設置最大過期時間為 24 小時(毫秒為單位)// 并設置只能通過 HTTP 訪問(防止 XSS 攻擊)res.cookie('count', count, { maxAge: 24 * 60 * 60 * 1000,  // 24小時后過期httpOnly: true                 // 僅通過 HTTP 訪問,JavaScript 無法讀取});// 將計數器的值以 JSON 格式返回給客戶端res.json({ count });
});// 定義監聽端口 - 服務器將在此端口接收客戶端請求
const port = 4000;// 讓應用監聽在指定端口并在控制臺輸出信息 - 啟動服務器
app.listen(port, () => {// 當服務器開始運行時,打印一條消息 - 指示服務器已成功啟動console.log(`Server is running on http://localhost:${port}`);
});

2.3.2 靜態頁面A(count.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 用于顯示計數結果的段落 --><p id="notice"></p><script>// 使用 fetch API 發送 GET 請求到計數端點 - 從服務器獲取計數并顯示async function getCount() {try {// 發送請求到服務器的 /count 端點const response = await fetch('http://localhost:4000/count', {method: 'GET',// 需要包含此行以發送 Cookie - 跨域請求默認不發送憑證credentials: 'include' }).then(response => response.json())// 將服務器返回的計數更新到頁面上document.getElementById('notice').innerHTML = `Count: ${response.count}`;} catch (error) {// 捕獲并打印請求過程中的任何錯誤console.error('Error:', error);}}// 頁面加載后立即執行獲取計數的函數getCount();</script>
</body>
</html>

CORS 相比 JSONP 更安全、更靈活,支持全類型請求和 Cookie 攜帶,是現代前端項目的首選跨域方案。通過本文的理論講解和實戰案例,相信您已經對 CORS 有了全面的理解。在實際開發中,合理運用 CORS 可以幫助我們構建更靈活、更強大的應用程序。

下一章將介紹 postMessage?方案 ,敬請期待!

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

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

相關文章

SpringBoot源碼解析(十五):spring-boot-autoconfigure.jar的模塊化設計

前言 SpringBoot的自動配置是其革命性特性的核心&#xff0c;而spring-boot-autoconfigure.jar則是這一機制的物理載體。本文將深入剖析這個JAR包的模塊化設計哲學&#xff0c;從包結構劃分、條件注解體系到自動配置加載機制&#xff0c;全方位解析SpringBoot如何通過精妙的模…

學習筆記九:docker容器日志問題

docker容器日志問題 背景如何處理日志問題主要通過日志輪詢方式處理。修改 Docker 配置日志快速清理 背景 Docker 默認使用的是 json-file 日志驅動。日志會一直寫&#xff0c;一直寫&#xff0c;沒有限制、沒有輪轉、沒有清理&#xff01; 日志默認位置&#xff1a; /var/lib…

低成本同屏方案:電腦 + 路由器實現 50 臺安卓平板實時同屏

引言 在教育機構、小型培訓場景或企業簡易會議中&#xff0c;常面臨以最低成本實現多設備同屏的需求。本文針對 "電腦 路由器 50 臺安卓平板" 的極簡硬件組合&#xff0c;詳細剖析實時同屏的實現路徑&#xff0c;從問題分析到技術落地提供全流程解決方案&#xff0…

Unity ECS DOTS技術實現50000個cube隨機循環移動流程

前言 之前使用過ECS面向組件開發&#xff0c;一直想試一下Unity的ECS DOTS技術&#xff0c;但是苦于入門門檻太高&#xff0c;下載官方的Demo&#xff0c;發現代碼哪哪兒都看不懂&#xff0c;一大堆API聞所未聞&#xff0c;而且沒有一個入門的流程&#xff0c;導致無法進行下去…

設計模式精講 Day 3:抽象工廠模式(Abstract Factory Pattern)

【設計模式精講 Day 3】抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09; 文章簡述 在軟件開發中&#xff0c;隨著業務復雜度的提升&#xff0c;系統需要支持多種產品族的創建。抽象工廠模式正是為了解決這一問題而誕生的設計模式之一。本文作為“設計模式精講”…

Kafka消息零丟失架構設計:從原理到實戰的全方位保障

引言 在構建高可靠分布式系統時&#xff0c;Kafka作為核心消息中間件被廣泛應用于數據管道、實時流處理等關鍵場景。然而&#xff0c;分布式環境下的網絡波動、節點故障等因素可能導致消息丟失&#xff0c;如何確保Kafka實現端到端的消息零丟失成為架構設計的關鍵挑戰。本文將…

Python學習筆記:錯誤和異常處理

1. 什么是錯誤和異常 在Python中&#xff0c;錯誤可以分為兩類&#xff1a; 語法錯誤(Syntax Errors)&#xff1a;代碼不符合Python語法規則異常(Exceptions)&#xff1a;語法正確的代碼在運行時發生的錯誤 # 語法錯誤示例 print("Hello World" # 缺少右括號# 異…

為什么要進行行為驗證,行為驗證方式有哪些?

進行行為驗證的主要目的是提高賬戶安全性、防范自動化攻擊、增強用戶身份確認精準度、優化用戶體驗。其中&#xff0c;提高賬戶安全性最為關鍵。行為驗證能通過分析用戶的行為模式&#xff0c;如操作習慣、設備使用特點等&#xff0c;識別出非正常或惡意活動&#xff0c;迅速采…

主流Java Redis客戶端(Jedis、Lettuce、Redisson)差異對比

主流Java客戶端對比&#xff1a;Jedis采用阻塞I/O&#xff0c;需連接池支持&#xff1b;Lettuce/Redisson基于Netty非阻塞I/O。Jedis輕量但并發能力弱&#xff0c;Lettuce支持10K并發且為SpringBoot默認&#xff0c;Redisson提供分布式功能但性能稍遜。 Redisson Lettuce 在 …

使用Hexo搭建博客網站(二)

設置主題 我們在官方主題中選擇一個自己喜歡的主題 來到GitHub&#xff0c;將它git clone到當前項目的themes文件夾中 設置_config.yml 找到 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: landscape 只需將這個landscape名字…

springAI 大模型應用開發

一 筆記總結 1.1 spring AI 實戰 1.1.1 spring aideepseek整合 通過使用spring ai 調用大模型deepseek&#xff0c;實現對話聊天&#xff0c;文字轉圖片&#xff0c;文字轉音頻。 1.1.2 OLLAMA Ollama 專為本地部署和運行大型語言模型&#xff08;LLM&#xff09;而設計的…

Java + Spring Boot 后端防抖應用實例

防抖工具&#xff08;適用單機部署&#xff09; DebounceUtil.java package com.weiyu.utils;import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.stereotype.Component;import java.util.Map; import java.util.c…

PostgreSQL 快速入門

PostgreSQL介紹 PostgreSQL 是一個功能強大的開源關系型數據庫系統&#xff0c;它使用并擴展了 SQL 語言&#xff0c;并結合了許多功能&#xff0c;可以安全地存儲和擴展復雜的數據工作 PostgreSQL 因其經過驗證的架構、可靠性、數據完整性、強大的功能集、可擴展性以及軟件背…

CppCon 2016 學習:Out of memory? Business as usual.

當程序因為內存耗盡而拋出 std::bad_alloc 異常時&#xff0c;這并不意味著程序必須崩潰或停止運行。我們應該考慮“內存不足”作為一種可能正常出現的情況&#xff08;“Out of memory? Business as usual.”&#xff09;&#xff0c;并設計應用程序能優雅地處理這種異常。 具…

廟算兵棋推演AI開發初探(8-神經網絡模型接智能體進行游戲)

前言の碎碎念 由于我做的模仿學習&#xff0c;可能由于沒有完全模仿&#xff0c;可以說效果很爛……后來用強化學習優化&#xff0c;這個倒是不用自己做數據集了&#xff0c;為方便大家只搞代碼&#xff0c;這里只說這部分的經歷和方法。 實踐基礎介紹 1-動作 先介紹一個強化…

Uart_Prj02 Windows 窗口版串口_Step1

完成上位機控制臺串口后&#xff0c;接下來想用C#做一個Windows 窗口版的串口。上位機編程不是很熟練&#xff0c;每天學一點做一點。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.…

自動駕駛系統研發—從工程視角看純視覺自動駕駛的安全挑戰與應對策略

???? 歡迎來到我的技術小筑,一個專為技術探索者打造的交流空間。在這里,我們不僅分享代碼的智慧,還探討技術的深度與廣度。無論您是資深開發者還是技術新手,這里都有一片屬于您的天空。讓我們在知識的海洋中一起航行,共同成長,探索技術的無限可能。 ?? 探索專欄:學…

PostgreSQL認證怎么選?PGCP中級認證、PGCM高級認證

上圖是2025年6月份最新的db-engines上的數據庫排名情況&#xff0c;可以看出PostgreSQL數據庫仍然呈上升趨勢&#xff0c;跟排名第三的"Microsoft SQL Server"起來越接近&#xff0c;國內亦是如此&#xff0c;PostgreSQL的熱潮依在&#xff0c;可見學習PostgreSQL數據…

Hive 3.x數據靜態脫敏與加密

引言 在大數據時代&#xff0c;數據已成為企業和組織的核心資產。作為數據處理的重要平臺&#xff0c;Hive 3.x存儲著大量敏感信息&#xff0c;如用戶個人身份、財務數據、商業機密等。如何確保這些數據在存儲和處理過程中的安全性&#xff0c;成為數據從業者關注的焦點。數據…

CppCon 2016 學習:Lightweight Object Persistence With Modern C++

你給出的這段文字是某個演講、論文或者技術文檔的概要&#xff08;Overview&#xff09;部分&#xff0c;內容主要是關于內存分配器&#xff08;allocator&#xff09;設計以及**對象持久化&#xff08;object persistence&#xff09;**的一些思路。讓我幫你逐條解析和理解&am…