☰
jeecg-boot跨域配置实战:从报错到生效的三档落地清单
2026/10/14 4:49:14 网站建设 项目流程

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,浏览器同源策略的"放行"机制)关卡。本文把卡点、内置能力和三档环境的做法一次讲清。

① 现象拆解:请求卡在哪一层

把一次跨域请求的生命周期拆开看,卡点不在服务端代码,而在链路上的"放行层":

  1. 浏览器发起跨域请求前,先自动发一个 OPTIONS 预检请求(preflight,正式请求前的"敲门"动作),问对方:"POST 能不能带X-Access-Token头?"
  2. 放行层检查 Origin、请求方法、请求头,通过才回Access-Control-Allow-Origin等响应头;
  3. 放行层不同,落点不同:单体部署时后端 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 配置互相干扰
网关全局 CORSjeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.ymlglobalcors下放行*,同样允许凭证微服务部署的统一放行层
前端本地代理jeecgboot-vue3/vite.config.tsVITE_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 开销。

④ 如何确认配置已生效

  1. 对接口手动发 OPTIONS 预检(带Origin和Access-Control-Request-Method: POST),返回 200 且无响应体——预检被正确拦截,而不是穿透进业务。
  2. 查看正式响应头:Access-Control-Allow-Origin的值等于你的前端域名(配置了allowCredentials时这里不能是*)。
  3. 控制台 Network 里正式请求的 Status 从(blocked:corserror)变为 200,登录、下拉字典等依赖X-Access-Token头的请求全部正常返回。
  4. 换一台不在白名单内的机器访问:预检直接失败、页面弹跨域错误——说明收紧确实生效,不是没配。

⑤ 反模式提醒

  • ❌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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询