聊聊跨域问题
跨域到底该谁管浏览器、代理与 Gateway CORS适用WeekFlow 前后端分离开发Vite Gateway Nginx读者前后端开发、运维1. 从一个报错说起前端跑在http://localhost:5173Gateway 在http://localhost:8080控制台出现Access to fetch at http://localhost:8080/api/v1/auth/health from origin http://localhost:5173 has been blocked by CORS policy后端说Gateway 加个CorsConfig。前端说Vite 配个 proxy 不就行了两个人都没错说的不是同一件事。把机制理顺本地能跑、上线不踩坑、排查能快。2. 跨域是浏览器的规矩CORSCross-Origin Resource Sharing不是 Spring、不是 Nginx 发明的业务规则是浏览器对页面里 JavaScript 的安全限制。浏览器在把响应交给 JS 之前会问页面来源Origin和请求 URL 是否同源不同源的话响应头里有没有「允许这个来源访问」的声明同源要求协议、域名、端口三者完全一致页面 Origin请求 URL是否跨域http://localhost:5173http://localhost:8080/api/...是端口不同http://localhost:5173http://127.0.0.1:8080/api/...是域名不同https://weekflow.comhttps://weekflow.com/api/...否同源https://app.weekflow.comhttps://api.weekflow.com/...是子域不同Postman、curl、Feign、Gateway 转发到下游——都不走这套。所以「Postman 能通、浏览器报 CORS」是正常现象。允许跨域时服务端需在响应里带上类似头Access-Control-Allow-Origin: http://localhost:5173 Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS Access-Control-Allow-Headers: Authorization, Content-Type Access-Control-Allow-Credentials: true没有这些头浏览器会拦截JS 读不到 body。Network 里可能已是 200但fetch仍会进catch。结论限制来自浏览器「允不允许跨」必须由某层 HTTP 服务通过响应头声明。3. 前端写死后端地址一定跨域吗必须要 CorsConfig 吗3.1 写死地址 ≠ 一定跨域跨域看的是页面 Origin 和请求 URL 是否同源跟 URL 是相对路径还是写死的绝对地址无关。// 页面在 http://localhost:5173// 情况 A写死 8080 → 跨域5173 ≠ 8080fetch(http://localhost:8080/api/v1/auth/health)// 情况 B相对路径 Vite 代理 → 浏览器认为请求发往 5173同源fetch(/api/v1/auth/health)// 情况 C写死地址但页面本身就在 8080 上不常见// 例如静态资源也由 Gateway 或 Nginx 同端口提供 → 不跨域fetch(http://localhost:8080/api/v1/auth/health)环境变量也一样// .env: VITE_API_BASEhttp://localhost:8080fetch(${import.meta.env.VITE_API_BASE}/api/v1/auth/health)只要浏览器当前页面的 Origin 是5173请求目标是8080就是跨域。写死只是更容易把 host:port 写错成另一个源用相对路径/api/...则天然跟页面同源。3.2 跨域了是否必须要 CorsConfig不必须。CorsConfig只是「让 Gateway 在响应里加 CORS 头」这一种做法。跨域时浏览器要能正常读响应至少需要下面之一方案做法是否需要 Gateway CorsConfig同源代理推荐Vite / Nginx 反代前端用相对路径不需要Gateway CORSSpringCorsWebFilter需要或等价 Java/YAML 配置Nginx 层 CORSadd_header Access-Control-*不需要 Gateway 配Nginx 配不处理直连跨域 URL无任何 CORS 头浏览器拦截 JS 读响应WeekFlow 若采用开发 Vite 代理 生产 Nginx 同源反代前后端约定用/api/...则Gateway 的CorsConfig可以没有不影响正常用户访问。CorsConfig适合这些场景再开API 独立域名如api.weekflow.com页面在app.weekflow.com多个前端域名共用一个 API本地有人习惯直连http://localhost:8080调试且前端仍从 5173 发起请求第三方浏览器页面调用开放 APICORS 头只需在一层加Gateway 或 Nginx 二选一多层重复可能出 duplicate header浏览器照样报错。3.3 跨域但没 CORS 时后台有没有收到请求有可能收到了。CORS 拦的是浏览器是否允许 JS 读响应不是网络层能不能连上。典型现象Network 显示 200控制台报 CORSfetch拿不到数据。所以「接口在 Postman 里是好的」不能证明浏览器场景没问题。4. 两条解决思路思路一同源代理WeekFlow 推荐不让浏览器跨域把转发放在服务器侧。本地 — Vite// vite.config.tsexportdefaultdefineConfig({server:{proxy:{/api:{target:http://localhost:8080,changeOrigin:true,},/ws:{target:ws://localhost:8080,ws:true,changeOrigin:true,},},},})// 前端统一相对路径awaitfetch(/api/v1/auth/health)生产 — Nginxserver { listen 443 ssl http2; server_name weekflow.com; location / { root /var/www/weekflow; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://weekflow-gateway:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /ws/ { proxy_pass http://weekflow-gateway:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; } }页面与 API 在浏览器里都是https://weekflow.com不触发 CORS。思路二显式 CORS浏览器直连 API 域名由 Gateway或 Nginx返回Access-Control-Allow-*。WeekFlow Gateway 当前实现weekflow-gateway模块com.weekflow.gateway.config.CorsConfig允许http://localhost:5173。若团队确定永远走同源代理该类可删除或注释并在团队规范里写清楚。5. 容易踩坑的点OPTIONS 预检带Authorization、非简单 Content-Type 时浏览器会先发 OPTIONS。直连跨域 API 时 Gateway 必须正确处理走同源代理则通常无感。WebSocketREST 代理了/ws/也要单独配Vitews: true、Nginx Upgrade 头否则表现为 HTTP 正常、长连接失败。CredentialsCookie 方案下Allow-Origin不能为*须指定具体域名且Allow-Credentials: true。Bearer Token 一般简单些。开发与生产策略不一致开发用 proxy、预发却改成https://api.staging.xxx.com直连联调阶段会突然冒出 CORS。团队应统一各环境前端 baseURL 怎么配、是否允许写死后端 host。微服务间调用Gateway → auth-service、OpenFeign 等不涉及 CORS仅影响浏览器里的 JS。6. WeekFlow 团队约定建议前端请求使用相对路径/api/...、/ws/...环境变量里不要写死后端host:port除非明确走跨域 CORS 方案。本地Vite proxy → Gateway8080。生产Nginx 同域名反代 → Gateway。GatewayCorsConfig按需启用API 独立域名或多前端源时再开。CORS 只在一层配置避免 Gateway 与 Nginx 重复。7. 排查清单浏览器报 CORS 时依次确认当前页面 Origin 是什么地址栏 端口请求完整 URL 是什么相对路径还是写死的绝对地址中间有没有 Vite / Nginx 代理代理规则是否覆盖该路径若是跨域直连Gateway 或 Nginx 是否返回了 CORS 头看 Response Headers是否只有浏览器失败、Postman 正常是则基本可断定 CORS 问题8. 相关代码与文档项位置Gateway CORS可选weekflow-gateway/.../config/CorsConfig.javaGateway 路由weekflow-gateway/src/main/resources/application.yml开发计划 Step 1.3.4docs/architecture/03-开发计划.md9. 一句话总结写死后端地址只有页面 Origin 与目标 URL 不同源时才跨域写死8080而页面在5173就会跨域。CorsConfig不是必选项是「跨域直连 API」时的一种解法同源代理方案下可以不要。团队真正要对齐的是前端 URL 怎么写、代理在哪一层、什么场景才开 CORS。

相关新闻

C/C++与Java混合的JNI编程

C/C++与Java混合的JNI编程

Java与JNI 1.1. 什么是Java? Java是一种高级编程语言,也是一个计算平台(通常指Java虚拟机)。最初由Sun Microsystems公司(后被Oracle收购)的James Gosling和他的团队在1995年发布。Java语言的设计目标是简单性、健壮性和跨平台兼容性。以下…

2026/7/2 1:48:29阅读更多 →
C++ PDF解析渲染库Poppler全方位实战:场景、库对比、CMake集成、可运行代码

C++ PDF解析渲染库Poppler全方位实战:场景、库对比、CMake集成、可运行代码

C 生态一直缺少开箱即用、稳定可靠的 PDF 处理库。Poppler 是工业级开源 PDF 解析与渲染引擎,基于老牌 Xpdf 重构,广泛用于 Linux 桌面、服务端文档解析、PDF 预览、文本抽取、格式转换。本文详细讲解 Poppler 核心能力、适用业务场景、与 MuPDF / PDFiu…

2026/7/2 1:48:29阅读更多 →
采齿背后的能量闭包原理

采齿背后的能量闭包原理

感谢您的补充说明。您提到的“采齿”概念,确实与能量自持和能量闭包密切相关,涉及能量输入与状态维持之间的关系。这是一个非常深刻的视角。不过,为了能更准确地为您提供帮助,我需要澄清一下:在标准的医学或牙科术语中…

2026/7/2 1:48:29阅读更多 →
容器资源限制与配额管理实践

容器资源限制与配额管理实践

容器资源限制与配额管理实践随着容器化技术的普及,尤其是以Docker和Kubernetes为代表的平台成为云原生应用的基石,如何高效、安全地管理容器资源,确保应用性能与稳定性,同时提升基础设施利用率,已成为运维与开发团队面…

2026/7/2 2:53:37阅读更多 →
SpringBoot开发实践

SpringBoot开发实践

SpringBoot开发实践:从“约定大于配置”到高效微服务在Java企业级开发的演进历程中,SpringBoot无疑是一道分水岭。它不仅仅是一个框架的升级,更代表了一种开发哲学的转变——从繁琐的XML配置地狱到“约定大于配置”的优雅实践。本文将深入探讨…

2026/7/2 2:53:37阅读更多 →
文件名可控漏洞:Web安全中常被忽视的“最后一公里”攻防解析

文件名可控漏洞:Web安全中常被忽视的“最后一公里”攻防解析

1. 项目概述:从一道靶场题看文件上传的“最后一公里”做Web安全测试的朋友,对Upload-Lab这个靶场应该都不陌生。它几乎成了我们学习文件上传漏洞的“必修课”,从最基础的前端绕过,到复杂的服务端解析、条件竞争,关卡设…

2026/7/2 2:53:37阅读更多 →
HTTPS抓包实战:BurpSuite中间人攻击原理与三大配置支柱详解

HTTPS抓包实战:BurpSuite中间人攻击原理与三大配置支柱详解

1. 项目概述:HTTPS抓包的“拦路虎”与BurpSuite的破局之道 如果你是一名安全测试工程师、渗透测试人员,或者是对网络通信原理充满好奇的开发者,那么“HTTPS抓包”这个操作对你来说一定不陌生,也一定不陌生于它带来的挫败感。明明在…

2026/7/2 2:53:37阅读更多 →
终极指南:三步搞定GSYVideoPlayer比例适配,告别视频黑边烦恼

终极指南:三步搞定GSYVideoPlayer比例适配,告别视频黑边烦恼

终极指南:三步搞定GSYVideoPlayer比例适配,告别视频黑边烦恼 【免费下载链接】GSYVideoPlayer Video players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, w…

2026/7/2 2:53:37阅读更多 →
Python异步编程实战技巧全解析

Python异步编程实战技巧全解析

Python异步编程实战技巧全解析在当今高并发的网络应用开发中,异步编程已成为Python开发者必须掌握的核心技能。从传统的回调地狱到现代的async/await语法,Python异步编程经历了革命性的演进。本文将深入解析Python异步编程的实战技巧,帮助开发…

2026/7/2 2:48:33阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/1 4:42:14阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/1 5:19:01阅读更多 →
塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 想在《塞尔达传说:旷野之息…

2026/7/2 0:03:01阅读更多 →
告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

在本地开发环境使用云厂商 CLI 时,传统的 AccessKey(AK)方式需要手动创建、下载和保管密钥,不仅繁琐,还存在泄漏风险。其实,主流云平台都已提供基于 OAuth 2.0 的免密认证方案,让开发者可以通过浏览器登录一次性完成授权,CLI 自动管理临时凭证的刷新,兼顾了便利与安全…

2026/7/2 0:03:01阅读更多 →
基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

1. 项目背景与核心价值在嵌入式系统开发领域,高精度定位与导航一直是极具挑战性的技术方向。传统方案往往面临成本、精度和实时性难以兼顾的困境。这个项目通过13DOF(13自由度)传感器组合与PIC32MZ2048EFH100高性能MCU的协同工作,…

2026/7/2 0:03:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/2 0:33:58阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/2 1:32:11阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/2 1:50:13阅读更多 →