WebSocket 也有跨域问题?如何让 Spring Boot WebSocket 允许跨域连接?
前言
在现代 Web 开发中,跨域问题一直是开发者必须面对的挑战。无论是传统的 HTTP 请求还是实时通信的 WebSocket,浏览器的同源策略(Same-Origin Policy)都可能成为功能实现的拦路虎。许多开发者对 HTTP 的跨域解决方案(如 CORS)已经非常熟悉,但面对 WebSocket 的跨域问题时,常常陷入困惑:“WebSocket 不是基于 TCP 的协议吗?为什么也会有跨域限制?”
本文将深入剖析 WebSocket 的跨域机制,并手把手教你如何通过 Spring Boot 实现安全的 WebSocket 跨域连接。
一、WebSocket 跨域问题的本质
1.1 浏览器安全策略的延伸
WebSocket 协议虽然在传输层基于 TCP,但其握手阶段仍通过 HTTP 完成。浏览器在发起 WebSocket 连接时,会携带 Origin
头字段,标识请求来源。服务器若未明确允许该来源,浏览器会拒绝建立连接。
举个例子:
-
前端页面部署在
https://client.com
-
WebSocket 服务端地址为
wss://api.server.com/ws
此时,浏览器会检查api.server.com
是否允许client.com
的跨域请求。
1.2 与 HTTP CORS 的差异
HTTP 的跨域通过预检请求(Preflight)和响应头(如 Access-Control-Allow-Origin
)实现,而 WebSocket 的跨域处理更为简单:
-
握手阶段验证
Origin
头。 -
服务器返回
HTTP 101 Switching Protocols
表示接受跨域。 -
没有预检请求,直接通过响应头控制权限。
1.3 典型的跨域错误场景
若未正确配置,浏览器控制台会抛出错误:
plaintext
WebSocket connection to 'wss://api.server.com/ws' failed: Error during WebSocket handshake: Unexpected response code: 403
二、Spring Boot WebSocket 的跨域解决方案
Spring Boot 提供了两种主流的 WebSocket 实现方案:原生 WebSocket 与 STOMP over WebSocket。以下分别介绍它们的跨域配置方法。
2.1 方案一:原生 WebSocket 跨域配置
2.1.1 实现 HandshakeInterceptor
拦截器
通过拦截握手请求,动态验证 Origin
头:
java
public class CustomHandshakeInterceptor implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Map<String, Object> attributes) {// 从请求头中获取 OriginString origin = request.getHeaders().getOrigin();// 定义允许的域名列表(可改为从配置读取)List<String> allowedOrigins = Arrays.asList("https://client.com", "http://localhost:8080");if (allowedOrigins.contains(origin)) {return true; // 允许握手}response.setStatusCode(HttpStatus.FORBIDDEN);return false; // 拒绝连接}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Exception exception) {} }
2.1.2 注册 WebSocket 端点并配置跨域
在配置类中启用 WebSocket 并添加拦截器:
java
@Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new MyWebSocketHandler(), "/ws").addInterceptors(new CustomHandshakeInterceptor()).setAllowedOrigins("*"); // 谨慎使用通配符} }
⚠️ 关键注意事项
-
setAllowedOrigins("*")
会允许所有来源,存在安全风险,建议在生产环境中指定具体域名。 -
若同时使用拦截器和
setAllowedOrigins
,拦截器的验证逻辑优先执行。
2.2 方案二:STOMP over WebSocket 跨域配置
对于使用 STOMP 协议的场景(如结合 Spring Messaging),需通过 WebSocketMessageBrokerConfigurer
配置。
2.2.1 基础配置类
java
@Configuration @EnableWebSocketMessageBroker public class StompWebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/stomp/ws").setAllowedOrigins("https://client.com").withSockJS(); // 可选,支持 SockJS 回退}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker("/topic");registry.setApplicationDestinationPrefixes("/app");} }
2.2.2 动态 Origin 控制
若需根据请求动态判断,可自定义 DefaultHandshakeHandler
:
java
public class CustomHandshakeHandler extends DefaultHandshakeHandler {@Overrideprotected boolean validateOrigin(HttpServletRequest request) {String origin = request.getHeader("Origin");// 自定义验证逻辑(例如查询数据库)return isValidOrigin(origin); } }// 在配置类中替换默认 Handler registry.addEndpoint("/stomp/ws").setHandshakeHandler(new CustomHandshakeHandler());
三、进阶:解决常见疑难问题
3.1 场景:Nginx 反向代理导致跨域失败
若服务端通过 Nginx 转发 WebSocket 请求,需确保代理配置正确:
nginx
location /ws/ {proxy_pass http://backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# 关键:传递 Origin 头proxy_set_header Origin $http_origin; }
3.2 场景:Spring Security 拦截 WebSocket 握手
当项目集成 Spring Security 时,需显式放行 WebSocket 端点:
java
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/ws/**").permitAll() // 放行 WebSocket 端点.anyRequest().authenticated();} }
3.3 场景:SockJS 的跨域兼容性
使用 SockJS 时,浏览器可能发起 OPTIONS
预检请求,需确保 CORS 配置覆盖:
java
// 针对 /info 端点的预检请求 @Override public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("https://client.com").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS"); }
四、安全实践:避免跨域配置中的陷阱
4.1 风险:滥用通配符 *
的后果
-
CSRF 攻击:恶意网站可通过 WebSocket 窃取会话信息。
-
数据泄露:未授权域名获取实时推送数据。
解决方案:
-
通过环境变量动态加载允许的域名列表。
-
结合 OAuth 2.0 在握手阶段验证 Token。
4.2 防御:WebSocket 层的身份验证
在握手拦截器中实现权限校验:
java
public boolean beforeHandshake(...) {String token = request.getHeaders().getFirst("Authorization");if (!jwtService.validateToken(token)) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return false;}return true; }
五、测试与验证
5.1 使用 Postman 测试跨域
Postman 支持手动设置 Origin
头:
-
新建 WebSocket 请求,URL 输入
wss://api.server.com/ws
-
在 Headers 中添加
Origin: https://unauthorized-site.com
-
观察连接是否被拒绝
5.2 浏览器端验证
在前端代码中捕获连接错误:
javascript
const socket = new WebSocket('wss://api.server.com/ws'); socket.onerror = (error) => {console.log('Connection failed:', error); };
六、总结
WebSocket 的跨域问题本质上是浏览器安全策略对握手阶段的约束。在 Spring Boot 中,通过合理配置 HandshakeInterceptor
、WebSocketConfigurer
或 WebSocketMessageBrokerConfigurer
,开发者可以灵活控制跨域行为。关键要点包括:
-
避免使用通配符,尽量动态验证 Origin。
-
区分 HTTP CORS 与 WebSocket 跨域,二者需独立配置。
-
结合安全框架,在握手阶段实现身份认证。
通过本文的实践方案,开发者不仅能解决跨域问题,还能构建更健壮的实时通信系统。
附录:常见问题速查表
问题现象 | 可能原因 | 解决方案 |
---|---|---|
连接返回 403 Forbidden | Origin 未在允许列表中 | 检查 setAllowedOrigins 配置 |
首次连接成功,重连失败 | 反向代理未保持 WebSocket 头 | 配置 Nginx 的 proxy_set_header |
前端控制台报 “Invalid UTF-8” | 未正确处理二进制消息 | 配置 BinaryType 或使用 STOMP |
掌握这些技巧后,WebSocket 跨域将不再是阻碍实时通信的绊脚石。
相关文章:
WebSocket 也有跨域问题?如何让 Spring Boot WebSocket 允许跨域连接?
前言 在现代 Web 开发中,跨域问题一直是开发者必须面对的挑战。无论是传统的 HTTP 请求还是实时通信的 WebSocket,浏览器的同源策略(Same-Origin Policy)都可能成为功能实现的拦路虎。许多开发者对 HTTP 的跨域解决方案ÿ…...
音视频入门基础:MPEG2-PS专题(8)——使用Wireshark分析GB28181的PS流
音视频入门基础:MPEG2-PS专题系列文章: 音视频入门基础:MPEG2-PS专题(1)——MPEG2-PS官方文档下载 音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件 音视频入门基础…...
Bash详解
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 Bash详解 Bash(Bourne Again SHell)是Linux和Unix系统中最常用的命令行解释器之一。它不仅提供了强大的命令行操作功能,还支持脚本编程,使得用户能够自动化任务和实现复杂的操作。本文将详细介绍Bash…...
WORD+VISIO输出PDF图片提高清晰度的方法
WORDVISIO输出PDF图片提高清晰度的方法 part 1: visio 绘图part 2: word 导出 part 1: visio 绘图 先在visio中把图片和对应的文字调整为适合插入到文章中的尺寸; 在visio中把所有元素进行组合; 把组合后的图片长和宽等比例放缩,如放大10倍…...
springMVC--Controller配置总结
控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方式 控制器负责解析客户的请求并转换成一个模型 在springMVC中,一个控制器类可以包含多种方法 在springMVC中,对于controller的配置有多种 实现Contr…...
JavaScript BOM核心对象、本地存储
目录 BOM 核心对象详解 一、location 对象 1. 常用属性 2. 常用方法 3. 应用场景 二、navigator 对象 1. 核心属性 2. 常用方法 3. 应用场景 三、history 对象 1. 核心属性和方法 2. 应用场景 四、兼容性与注意事项 五、总结 本地存储与复杂数据类型处理 一、本…...
单元测试之测试覆盖率-jacoco基本使用
简介 免费的、开源的、针对java的单元测试覆盖率工具。基于字节码,无需源码也可以工作。 代码覆盖率:用来衡量测试代码对功能代码的测试情况,量化说明测试的充分度。通过执行测试用例,功能代码中的哪些行被执行了,哪…...
css3.31面试题
CSS 相关的面试题一般围绕基础知识、布局、性能优化、兼容性、深入原理等几个方向。以下是一些常见的面试题总结: CSS 基础知识 盒模型(Box Model)是什么?有哪些类型? px、em、rem、vw、vh、% 的区别? …...
Nature Electronics|一种透气、可拉伸的液态金属基3D电子皮肤系统(健康监测/可穿戴电子/透汗透气性电子/电子皮肤/柔性电子/集成电路)
一、 摘要 穿戴式和皮肤电子设备的发展要求高密度可伸展电子系统能够与软组织共形,持续运行并提供长期的生物相容性。大多数可拉伸电子系统的集成密度低,并且与外部印刷电路板连接,这限制了功能,降低了用户体验并阻碍了长期可用性。在此,作者提出了一种可渗透的三维集成电…...
【家政平台开发(15)】解锁Spring Boot:家政平台后端开发全攻略
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…...
AI Agent设计模式二:Parallelization
概念 :并行任务执行引擎 ✅ 优点:提升吞吐量,充分利用多核资源❌ 缺点:复杂度高,存在竞态条件风险 from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, START, END from typing impor…...
Upload-labs靶场通关
之前搭好了靶场,Upload-labs 靶场搭建 及一句话木马的原理与运用-CSDN博客 今天开始通关并写详细流程 Pass-1 来到靶场的第一关 先随便上传php 代码 点击上传 发现文件类型被限制了 方法1: 改文件后缀为合法文件(.jpg .png .gif…...
Python数据结构之有序列表
一.基本介绍 在有序列表中,元素的相对位置取决于它们的基本特征。它们通常以升序或者降序排列,并且我们假设元素之间能进行有意义的比较。有序列表和无序列表(链表)的许多操作都是相同的。 二.代码实现 class OrderedList:"""有序列表类…...
LMK04828使用指南-01-简介与引脚功能描述
简介 LMK0482x系列是业界性能最高的时钟调节器,支持JEDEC JESD204B。 PLL2的14个时钟输出可以配置为使用设备和SYSREF时钟驱动七个JESD204B转换器或其他逻辑设备。可以使用直流和交流耦合提供SYSREF。不限于JESD204B应用,14个输出中的每一个都可以单独…...
统计学基本原理
目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…...
日常真实工作环境,Mysql常用操作命令,笔记!
1、开放增删改查权限,不开放表结构修改权限 有许多生产环境是不需要修改表结构的,也是为了防止SQL注入。 创建用户 mysql> grant all on *.* to ie% identified by test1设置权限 1.首先我们先回收所有权限。 revoke all on *.* from ie% ;2.设…...
洛谷题单3-P1307 [NOIP 2011 普及组] 数字反转-python-流程图重构
题目描述 给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。 输入格式 一个整数 N N N。 …...
洛谷题单3-P1420 最长连号-python-流程图重构
题目描述 输入长度为 n n n 的一个正整数序列,要求输出序列中最长连号的长度。 连号指在序列中,从小到大的连续自然数。 输入格式 第一行,一个整数 n n n。 第二行, n n n 个整数 a i a_i ai,之间用空格隔开…...
PostgreSQL:表分区与继承
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【NLP 55、投机采样加速推理】
目录 一、投机采样 二、投机采样改进:美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选(可选) Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的,其实我在意透了 —— 25.4.4 一、…...
CSS 创建与使用学习笔记
一、CSS 的作用 CSS(层叠样式表)用于控制 HTML 文档的样式和布局。当浏览器读取一个样式表时,它会根据样式表中的规则来格式化 HTML 文档,从而实现页面的美化和布局调整。 二、插入样式表的方法 CSS 可以通过以下三种方式插入到…...
CSS Id 和 Class 选择器学习笔记
一、概述 在 CSS 中,id 和 class 选择器是用于为 HTML 元素指定样式的强大工具。它们可以帮助我们精确地控制页面中元素的样式,让页面设计更加灵活和高效。 二、id 选择器 1. 定义和使用 定义:id 选择器用于为具有特定 id 属性的 HTML 元素…...
从小米汽车事故反思 LabVIEW 开发
近期,小米汽车的一起严重事故引发了社会各界的广泛关注。这起事故不仅让我们对智能汽车的安全性产生了深深的思考,也为 LabVIEW 开发领域带来了诸多值得汲取的知识与领悟。 在智能汽车领域,尤其是涉及到智能驾驶辅助系统时,安全是…...
解锁工业通信:Profibus DP到ModbusTCP网关指南!
解锁工业通信:Profibus DP到ModbusTCP网关指南! 在工业自动化领域,随着技术的不断进步和应用场景的日益复杂,不同设备和系统之间的通讯协议兼容性问题成为了工程师们面临的一大挑战。尤其是在Profibus DP和Modbus/TCP这两种广泛应…...
web漏洞靶场学习分享
靶场:pikachu靶场 pikachu漏洞靶场漏洞类型: Burt Force(暴力破解漏洞)XSS(跨站脚本漏洞)CSRF(跨站请求伪造)SQL-Inject(SQL注入漏洞)RCE(远程命令/代码执行)Files Inclusion(文件包含漏洞)Unsafe file downloads(不安全的文件下载)Unsafe file uploads(不安全的文…...
【C++学习笔记】十三、速通笔记
完整的C编程教程 目录 开发环境配置C知识体系现代C特性设计模式数据结构CMake项目构建调试技巧进阶主题学习资源 1. 开发环境配置 1.1 安装编译器 sudo apt-get install g build-essential1.2 安装构建工具 sudo apt-get install cmake1.3 VS Code配置 安装C扩展配置调试…...
硬件电路(23)-输入隔离高低电平有效切换电路
一、概述 项目中为了防止信号干扰需要加一些隔离电路,而且有时传感器的信号是高有效有时是低有效,所以基于此背景,设计了一款方便实现高低电平有效检测切换电路。 二、应用电路...
基于深度学习的多模态癌症数据集调研
基于深度学习的多模态癌症数据集调研 关键词: 癌症、分割、多模态、radiology、pathology、深度学习 目录: 一、 数据集总结 二、 胶质瘤/脑肿瘤(glioma) 三、 肺癌/非小细胞肺癌(NSCLC) 四、 乳腺癌&am…...
Logo语言的系统监控
Logo语言的系统监控 引言 在信息技术飞速发展的时代,系统监控成为了确保计算机系统和网络平稳运行的重要手段。系统监控不仅可以实时跟踪系统的性能、资源使用情况和安全风险等,还能够在出现问题时及时发出警报,从而避免潜在的故障和损失。…...
Go语言-初学者日记(八):构建、部署与 Docker 化
🧱 一、go build:最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁,直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…...
青少年编程与数学 02-015 大学数学知识点 08课题、信息论
青少年编程与数学 02-015 大学数学知识点 08课题、信息论 一、信息论基础二、熵与信息量三、信源编码四、信道编码五、率失真理论六、信息论的应用七、网络信息论八、信息论与统计学习九、量子信息论十、信息论的前沿研究总结 信息论是研究信息传输、存储和处理的数学理论&…...
【已解决】Webstorm 每次使用 git pull/push 都要输入令牌/密码登录
解决办法:勾上【使用凭据帮助程序】(英文:Use credential helper)...
FreeRTOS:嵌入式实时操作系统的轻量化解决方案
一、FreeRTOS 的核心定位 FreeRTOS(Free Real-Time Operating System)是一款专为微控制器及资源受限的嵌入式设备设计的开源实时操作系统内核。自2003年由Richard Barry发布以来,其以轻量化、高实时性、低资源占用的特点,成为物…...
Linux操作系统 4.Linux实用操作
一、各类小技巧(快捷键) 强制停止 退出、登出 历史命令搜索 光标移动 1.CTRL C 强制停止 1.Linux某些程序的运行,如果想要强行停止它,可以使用ctrlc 2.命令输入错误,也可以通过快捷键ctrl c,退出当前输入࿰…...
学透Spring Boot — 010. 单元测试和Spring Test
系列文章目录 这是CSDN postnull 博客《学透Spring Boot》系列的一篇,更多文章请移步:Postnull - 学透Spring Boot系列文章 文章目录 系列文章目录前言1. 基本概念UT 单元测试TDD 测试驱动开发UT测试框架Mock框架 3. Spring Test为什么要用Spring Test引…...
Perl语言的文件系统
Perl语言中的文件系统操作 引言 在软件开发中,文件系统操作是一个不可或缺的部分。无论是简单的文件读取、写入,还是复杂的文件管理,合理的文件系统操作都能极大提升程序的效率和可维护性。Perl语言是一种强大的文本处理语言,凭…...
ffmpeg基础指令学习
文章目录 1. **基本的 FFmpeg 语法**2. **常见的 FFmpeg 基础指令****1. 转换视频格式****2. 视频剪切****3. 转换视频的编码****4. 提取音频****5. 改变视频分辨率****6. 改变音视频的比特率****7. 合并音视频****8. 提取视频中的一帧图片****9. 提取视频的帧速率(…...
英国电商物流变革:ebay私人卖家如何借势简易配送提升履约效率?
近年来,英国电商物流正在经历一场不小的变革。从“等待5-7个工作日”到如今“次日达”成为常态,市场和用户对配送效率的要求越来越高。对于在 eBay 平台上的私人卖家来说,这既是挑战,也是机会。如何用有限的资源跟上平台和消费者对…...
第15周:注意力汇聚:Nadaraya-Watson 核回归
注意力汇聚:Nadaraya-Watson 核回归 Nadaraya-Watson 核回归是一个经典的注意力机制模型,它展示了如何通过注意力权重来对输入数据进行加权平均。以下是该内容的核心总结: 关键概念 注意力机制框架:由查询(自主提示…...
批量图片文本识别重命名,批量ocr识别图片重命名,基于WPF和腾讯OCR云部署实,现批量对图片局部提取文字后重命名的操作详细步骤
1. 项目背景 在日常工作中,我们经常需要处理大量图片文件,这些图片可能包含重要的文字信息。为了提高工作效率,我们需要一种自动化的方式,从图片中提取文字,并根据提取的文字对图片进行重命名。 本项目基于 WPF 框架开发桌面应用程序,结合 腾讯 OCR…...
26考研——排序(8)
408答疑 文章目录 一、排序的基本概念二、插入排序三、交换排序四、选择排序五、归并排序、基数排序和计数排序六、排序的代码实操七、各种内部排序算法的比较及应用八、外部排序九、参考资料鲍鱼科技课件26王道考研书 十、总结基本排序算法希尔排序快速排序、堆排序和归并排序…...
KUKA机器人导入设备说明文件
KUKA机器人在应用中需要进行通讯配置,通讯前需要导入设备说明文件,比如常用的倍福设备说明文件。在Workvisual软件上通过以下步骤即可导入设备说明文件。 一、打开Workvisual软件,在选项卡【File】下找到【Import/Export】输入/输出并点击打…...
ssl.SSLCertVerificationError报错解决方案
这个错误 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate 指出 Python 在尝试建立安全的 HTTPS 连接时,无法验证远程服务器(在此案例中是 GitHub 或 Hugging Face…...
drawio导出流程图为白色背景png图片
draw.io 操作路径: 1.纯白背景图片(一般导出流程图就这种纯白背景,看自己需求 什么都不勾选 导出效果图 2.田字格白背景 只勾选网格 导出效果图 3.方块背景 只勾选背景 导出效果图 4.大方块背景 都勾选 导出效果图...
【Linux】——手撕线程池、简易线程池
前言 在现代计算机编程领域,随着多核处理器和分布式系统的广泛应用,并发编程变得越来越重要。而线程作为实现并发的基本手段之一,其重要性不言而喻。然而,在实际的应用开发中,如何高效地管理和调度线程,以充…...
使用mcp自定义编写mcp tool,使用 conda 启动,在cline中配置使用
自定义 mcp tool 例子 ## /langchain_learn/mcp学习/base_mcp_tool_study2.py # 导入必要模块 import os from typing import Optional from mcp.server.fastmcp import FastMCP# 初始化 MCP 服务器实例,指定服务器名称和版本 mcp_server FastMCP(name"DemoS…...
OpenEuler/CentOS一键部署OpenGauss数据库教程(脚本+视频)
📌OpenEuler/CentOS一键安装OpenGauss数据库教程 为什么需要OpenGauss一键安装脚本? 手动部署OpenGauss数据库时,环境适配、依赖冲突等问题常让开发者头疼。尤其对新人而言,官方文档的配置步骤可能耗时数小时甚至引发未知报错。 …...
python如何快速删除文件夹中的大量文件
在 Python 中,删除文件夹中的大量小图片文件可以通过使用 os 模块或 shutil 模块来实现。以下是一个示例代码,展示了如何快速删除指定文件夹中的所有文件。如果你只需要删除小图片文件,可以添加额外的逻辑来检查文件大小。 以下是一个示例代…...
【mongodb】MongoDB的应用场景
目录 1.说明2.内容管理系统(CMS)2.1 场景描述2.2 MongoDB优势2.3 示例 3.实时分析与大数据3.1 场景描述3.2 MongoDB优势3.3 示例 4.移动应用后端4.1 场景描述4.2 MongoDB优势4.3 示例 5.游戏开发5.1 场景描述5.2 MongoDB优势5.3 示例 6.电子商务平台6.1 …...
使用 Swift 实现 LRU 缓存淘汰策略
📌 实现思路 一、核心目标 我们要实现一个缓存类: 支持通过 get(key) 获取缓存的值;支持通过 put(key, value) 写入缓存;缓存容量有限,当超过容量时要淘汰最久未使用的元素。 二、为什么用「哈希表 双向链表」 功…...