当前位置: 首页 > news >正文

【Java】解决跨域问题的 8 种方案

🍓简介:java系列技术分享(👉持续更新中…🔥)
🍓初衷:一起学习、一起进步、坚持不懈
🍓如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓更多文章请点击
[

文章目录

  • 前言
    • 一、什么是跨域?为什么会出现跨域?
      • 1. 跨域定义
      • 2. 同源策略规则
      • 3. 跨域出现场景
    • 二、Java/SpringBoot 解决跨域的 8 种方法
      • 1. 全局跨域:注册 CorsFilter Bean
      • 2. 全局跨域:重写 WebMvcConfigurer
      • 3. 局部跨域:@CrossOrigin 注解
      • 4. 局部跨域:手动设置响应头
      • 5. 自定义 Filter 实现跨域
      • 6. Spring Cloud Gateway 网关跨域
      • 7. Nginx 代理解决跨域
      • 8. 拦截器方式实现跨域
    • 三、方案选择建议
    • 四、总结

前言

在前后端分离开发模式下,跨域(CORS)是几乎每位开发者都会遇到的前端请求被拦截问题。本文将从跨域原理讲起,一次性整理 Java 后端处理跨域的全局配置、局部控制、网关、代理等全套方案,复制即用,建议收藏。

一、什么是跨域?为什么会出现跨域?

1. 跨域定义

跨域是浏览器基于同源策略做出的安全限制:当请求的协议、域名、端口任意一项与当前页面不同,浏览器就会拦截该请求,导致接口无法正常调用。

2. 同源策略规则

只要有一项不一致,就触发跨域限制。

  • 协议相同(http / https)
  • 域名/IP 相同
  • 端口相同

3. 跨域出现场景

  • 前端地址:http://localhost:8080
  • 后端接口:http://localhost:9090
  • 端口不一致 → 跨域

说明:跨域是浏览器限制,服务器端实际已收到请求并处理,只是浏览器拒绝展示结果。

二、Java/SpringBoot 解决跨域的 8 种方法

1. 全局跨域:注册 CorsFilter Bean

通过注册 CorsFilter 全局过滤器,统一处理所有接口的跨域。

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigurationSource;importorg.springframework.web.filter.CorsFilter;@ConfigurationpublicclassGlobalCorsConfig{@BeanpublicCorsFiltercorsFilter(){CorsConfigurationconfig=newCorsConfiguration();config.addAllowedOriginPattern("*");config.setAllowCredentials(true);config.addAllowedMethod("*");config.addAllowedHeader("*");config.addExposedHeader("*");UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",config);returnnewCorsFilter(source);}}

2. 全局跨域:重写 WebMvcConfigurer

实现 WebMvcConfigurer 接口,重写 addCorsMappings 方法,极简全局配置。

importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods("GET","POST","OPTIONS","DELETE","PUT","PATCH").maxAge(3600);}}

3. 局部跨域:@CrossOrigin 注解

作用在类上:

@RestController@CrossOrigin(origins="*")publicclassTestController{}作用在方法上:@PostMapping("/user/login")@CrossOrigin(origins="*")publicStringlogin(){return"success";}

4. 局部跨域:手动设置响应头

importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHeaderController{@GetMapping("/test/header")publicStringtest(HttpServletResponseresponse){response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Methods","*");return"ok";}}

5. 自定义 Filter 实现跨域

importorg.springframework.context.annotation.Configuration;importjavax.servlet.*;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@ConfigurationpublicclassMyCorsFilterimplementsFilter{@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletResponseres=(HttpServletResponse)response;res.setHeader("Access-Control-Allow-Origin","*");res.setHeader("Access-Control-Allow-Methods","GET,POST,OPTIONS,DELETE");res.setHeader("Access-Control-Max-Age","3600");res.setHeader("Access-Control-Allow-Headers","*");chain.doFilter(request,response);}}

6. Spring Cloud Gateway 网关跨域

spring:cloud:gateway:# 。。。globalcors:# 全局的跨域处理add-to-simple-url-handler-mapping:true# 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins:# 允许哪些网站的跨域请求-"http://localhost:8090"allowedMethods:# 允许的跨域ajax的请求方式-"GET"-"POST"-"DELETE"-"PUT"-"OPTIONS"allowedHeaders:"*"# 允许在请求中携带的头信息allowCredentials:true# 是否允许携带cookiemaxAge:360000# 这次跨域检测的有效期

7. Nginx 代理解决跨域

server { listen 80; server_name localhost; location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT; add_header Access-Control-Allow-Headers *; if ($request_method = OPTIONS) { return 204; } proxy_pass http://127.0.0.1:9090; } }

8. 拦截器方式实现跨域

importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;@ComponentpublicclassCrossInterceptorextendsHandlerInterceptorAdapter{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS");response.setHeader("Access-Control-Max-Age","3600");response.setHeader("Access-Control-Allow-Headers","*");response.setHeader("Access-Control-Allow-Credentials","true");returntrue;}}

三、方案选择建议

  1. 单体项目:优先使用 WebMvcConfigurer 或 CorsFilter,全局简单高效。
  2. 微服务:在 Gateway 网关统一配置,下游服务无需重复处理。
  3. 仅个别接口跨域:直接使用 @CrossOrigin 注解。
  4. 生产环境:推荐 Nginx 代理方式,安全且易维护。

生产环境不建议用 * 全量放行,配置指定前端域名更安全。

四、总结

跨域本质是浏览器同源策略的安全限制,核心解决思路就是正确配置 CORS 响应头。以上8种方案覆盖单体、微服务、网关、Nginx 等所有常见场景,开发中可根据项目架构直接选用。

http://www.jsqmd.com/news/778169/

相关文章:

  • 2026年四川发光字招牌制作灯箱制作TOP采购榜单:综合实力与用户口碑双维度测评 - 深度智识库
  • 开源电商系统架构解析:从技术选型到核心模块实战
  • kafka 集群部署
  • 语言模型在沟通障碍场景下的性能优化实践
  • clawplay:基于Python的剧本化Web自动化与数据抓取框架实战
  • 中层管理者眼中的“A小姐”与“C先生”:绩效考核之外考验管理者的逆向领导力
  • SPG:扩散语言模型的稳定强化学习策略梯度方法
  • 祛痘泥膜哪个牌子好12天深度排浊净肌,告别脸蛋脏闷感 - 全网最美
  • 什么去黑头泥膜好用 7 天搞定顽固性黑头,亲测巨有效 - 全网最美
  • 2026年陕西及西安职高升学首选榜单及本科逆袭路径 - 深度智识库
  • AI辅助CTF解题:提示词工程与安全研究新范式
  • 免费开源矢量图形编辑器 Inkscape 1.4.4 发布:修复众多问题,提升性能还添新功能
  • 隐私计算框架Tensory:加密张量运算与机器学习安全实践
  • LLM增强扩散模型:提升文本到图像生成的语义理解
  • codebase-intel:为AI编程助手注入项目记忆与工程纪律的上下文智能层
  • 2026年上海瑜伽教培机构对比|亚太瑜伽TOP1,评分、价格、推荐率全解析 - 速递信息
  • 使用Taotoken CLI工具一键配置多开发环境下的模型调用参数
  • 2026 AI大会日程倒计时启动:3月锁定名额,6月关闭注册,8月关闭论文投稿(附各大会DDL对照表)
  • 2026年AI训练素材、图片、视频等数据集供应商推荐(附选型对比与避坑指南) - 品牌2025
  • EDA工具演进:从自动化到决策赋能,破解芯片设计生产力悖论
  • 素数筛-试除法 埃氏筛 线性筛
  • HookLaw:用React Hooks范式统一管理JavaScript副作用
  • FPGA与PC高速数据通道:基于FTDI同步FIFO的实战设计
  • 2026年设计师必备:十大电商主图、印刷行业图片与样机素材优质网站推荐 - 品牌2025
  • 2026年5月济南建设工程/股权/知识产权/租赁/合同纠纷处理指南:为何刘迅律师是您的优选专家? - 2026年企业推荐榜
  • Eclair:将Datalog逻辑程序编译为LLVM原生代码的实验性编译器
  • SAFE框架:提升LLM长文本生成质量的关键技术
  • 大语言模型逻辑键结构:原理、分析与优化实践
  • Docker容器化部署SoulseekQt:实现音乐共享服务的无头化与网页访问
  • 2026年GPON OLT厂家推荐:国内主流品牌实力解析,高性价比选型指南 - 速递信息