jeecg-boot跨域配置实战:从报错到生效的三档落地清单
【免费下载链接】jeecg-boot【低代码v2.0,一句话即可生成整个系统】企业级AI低代码平台,一键生成前后端代码甚至整个系统。 AI Skills 一句话画流程、设计表单、生成报表、大屏。内置 AI应用平台涵盖:AI聊天、知识库、流程编排、MCP插件等,兼容主流大模型。引领AI低代码「Skills 生成 → 在线配置 → 代码生成 → 手工合并->AI修改」开发模式,解决 Java 项目 90% 重复工作,提高效率又不失灵活。项目地址: https://gitcode.com/GitHub_Trending/je/jeecg-boot
在浏览器打开 jeecg-boot 低代码平台的前端页面,调接口的一瞬间,控制台弹出:Access to fetch at 'http://localhost:8080/jeecg-boot/sys/user/queryAllUserList' from origin 'http://localhost:3100' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present。前后端分离部署的 jeecg-boot(低代码 + AI 应用平台),只要前端和 API 不同源,就一定会撞上这道跨域(CORS,浏览器同源策略的"放行"机制)关卡。本文把卡点、内置能力和三档环境的做法一次讲清。
① 现象拆解:请求卡在哪一层
把一次跨域请求的生命周期拆开看,卡点不在服务端代码,而在链路上的"放行层":
- 浏览器发起跨域请求前,先自动发一个 OPTIONS 预检请求(preflight,正式请求前的"敲门"动作),问对方:"POST 能不能带
X-Access-Token头?" - 放行层检查 Origin、请求方法、请求头,通过才回
Access-Control-Allow-Origin等响应头; - 放行层不同,落点不同:单体部署时后端 CorsFilter 直接应答;微服务部署时请求先经 Spring Cloud Gateway(网关,所有请求的必经入口),由网关的全局 CORS 配置应答,直连后端服务再配 CORS 是多余的。
② 项目内置能力盘点
| 能力 | 所在位置 | 默认行为 | 适用场景 |
|---|---|---|---|
| 单体 CORS 过滤器 | jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java | 允许全部来源/请求头/方法,allowCredentials=true | 单体部署、前后端异源直连 |
| 环境条件开关 | jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/CorsFilterCondition.java | 检测到spring.cloud.nacos.discovery.server-addr即判定为微服务,不注册单体过滤器 | 防止单体与网关双份 CORS 配置互相干扰 |
| 网关全局 CORS | jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml | globalcors下放行*,同样允许凭证 | 微服务部署的统一放行层 |
| 前端本地代理 | jeecgboot-vue3/vite.config.ts | VITE_PROXY把/jeecg-boot等前缀转发到后端 | 本地开发零跨域 |
③ 三档环境分别怎么配
本地开发:改前端.env.development,让 dev server 代为转发,请求与页面同源,浏览器根本不发预检。
VITE_PROXY = [ ['/jeecg-boot', 'http://127.0.0.1:8080/jeecg-boot'], ['/prod-jeecg', 'http://127.0.0.1:8080/jeecg-boot'], ]这段改了什么:把接口前缀映射到本机后端端口,浏览器看到的始终是同源地址,跨域问题在源头消失。这一档的关键是让跨域根本不发生。
内网测试:微服务部署只改网关 yml 一处,所有下游服务自动放行,不用逐服务配置。
spring: cloud: gateway: server: webflux: globalcors: cors-configurations: '[/**]': allowed-origin-patterns: - 'http://192.168.10.*:3100'这一段把*收窄到内网网段:测试机换 IP 不用改网关,外网永远进不来。这一档的关键是收口在网关。
公网生产:单体场景改 WebMvcConfiguration.java 中corsFilter()的放行项:
corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedOriginPattern("https://your-domain.com"); corsConfiguration.addAllowedMethod(HttpMethod.GET); corsConfiguration.addAllowedMethod(HttpMethod.POST); corsConfiguration.addAllowedHeader("Content-Type"); corsConfiguration.addAllowedHeader("X-Access-Token"); corsConfiguration.setMaxAge(3600L);这一档的关键是来源、方法、请求头全白名单,并缓存预检一小时减少 OPTIONS 开销。
④ 如何确认配置已生效
- 对接口手动发 OPTIONS 预检(带
Origin和Access-Control-Request-Method: POST),返回 200 且无响应体——预检被正确拦截,而不是穿透进业务。 - 查看正式响应头:
Access-Control-Allow-Origin的值等于你的前端域名(配置了allowCredentials时这里不能是*)。 - 控制台 Network 里正式请求的 Status 从
(blocked:corserror)变为 200,登录、下拉字典等依赖X-Access-Token头的请求全部正常返回。 - 换一台不在白名单内的机器访问:预检直接失败、页面弹跨域错误——说明收紧确实生效,不是没配。
⑤ 反模式提醒
- ❌
setAllowCredentials(true)配addAllowedOrigin("*"),浏览器直接拒绝 → ✅ 用addAllowedOriginPattern("具体域名")。 - ❌ 微服务部署时逐个下游服务配 CORS,与网关配置互相干扰 → ✅ 只改网关
globalcors一处,单体过滤器已由CorsFilterCondition自动跳过。 - ❌ 只给 GET 放行了来源,登录接口 POST 仍然 403 → ✅ 方法、请求头与来源一起收紧,别漏
X-Access-Token。
放行规则对不对,看响应头就清楚。延伸阅读:配置类源码目录、网关配置 application.yml。
【免费下载链接】jeecg-boot【低代码v2.0,一句话即可生成整个系统】企业级AI低代码平台,一键生成前后端代码甚至整个系统。 AI Skills 一句话画流程、设计表单、生成报表、大屏。内置 AI应用平台涵盖:AI聊天、知识库、流程编排、MCP插件等,兼容主流大模型。引领AI低代码「Skills 生成 → 在线配置 → 代码生成 → 手工合并->AI修改」开发模式,解决 Java 项目 90% 重复工作,提高效率又不失灵活。项目地址: https://gitcode.com/GitHub_Trending/je/jeecg-boot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考