news 2026/5/8 18:28:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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 等所有常见场景,开发中可根据项目架构直接选用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 18:26:31

面试八股真题统计与面经

引言:记录自己5月份以来的面试真题以及感受,会持续更新开科唯识面试感受:总体面试情况是预定的30分钟聊满,还给了反问环节。目前结果不知道,大概率凉。说实话,面完出来我人是懵的。去之前我其实心里有底&am…

作者头像 李华
网站建设 2026/5/8 18:23:29

C++虚函数机制与性能优化深度解析

1. C虚函数机制深度解析虚函数是C实现运行时多态的核心机制,它允许子类重写父类的方法,并在运行时根据对象实际类型调用正确的函数实现。这种动态绑定特性是面向对象编程中"一个接口,多种实现"思想的关键支撑。1.1 虚函数表(vtbl)的…

作者头像 李华
网站建设 2026/5/8 18:22:41

Godot Pixel Renderer:3D模型实时渲染像素动画的完整指南

1. 项目概述:当3D建模遇上像素艺术如果你和我一样,是个对复古像素艺术情有独钟的游戏开发者,同时又不想被逐帧手绘动画的繁重工作量劝退,那么今天要聊的这个工具,可能会成为你工作流里的“神器”。我最近在捣鼓一个带有…

作者头像 李华
网站建设 2026/5/8 18:22:40

构建计算机光标技术支持网站:从原理到工程实践

1. 项目概述:一个为“计算机光标技术支持”而生的网站最近在GitHub上看到一个挺有意思的项目,叫seanpm2001/Computer-cursor-tech-support_Website。光看这个标题,可能很多人会有点懵:计算机光标技术支持?这听起来像是…

作者头像 李华
网站建设 2026/5/8 18:18:25

通用世界模型的三原则架构设计与实践

1. 项目概述"通用世界模型中的一致性三原则与架构设计"这个标题涉及人工智能领域的前沿研究方向。作为一名长期从事AI系统架构设计的从业者,我想分享在实际项目中构建通用世界模型时积累的经验。世界模型是指能够理解和预测环境变化的计算框架&#xff0c…

作者头像 李华
网站建设 2026/5/8 18:09:04

AI编程时代编辑器配置工程化:模块化、场景化与团队协同实践

1. 项目概述:AI时代下的编辑器配置管理新范式最近在折腾各种AI辅助编程工具,从GitHub Copilot到Cursor,再到一些本地部署的代码生成模型,发现一个挺烦人的问题:每个工具、每个项目,甚至每个团队成员&#x…

作者头像 李华