SpringBoot解决跨域的五种方式

 更新时间:2025年10月17日 08:50:13   作者:李广坤  
在 Spring Boot 中解决跨域(CORS,Cross-Origin Resource Sharing)问题有 多种方式,适用于不同场景,下面系统地介绍 5 种主流方法,从简单到灵活,附代码示例和适用场景,需要的朋友可以参考下

在 Spring Boot 中解决跨域(CORS,Cross-Origin Resource Sharing)问题有 多种方式,适用于不同场景。下面系统地介绍 5 种主流方法,从简单到灵活,附代码示例和适用场景。

方法 1:使用 @CrossOrigin 注解(最简单)

适用场景: 单个 Controller 或方法需要跨域

@RestController
@CrossOrigin(origins = "http://localhost:3000") // 允许指定来源
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        return new User("John");
    }

    // 或只对某个方法生效
    @CrossOrigin(origins = "*") // 允许所有来源(生产环境慎用!)
    @PostMapping("/save")
    public String save() {
        return "ok";
    }
}

优点:

  • 简单、直观
  • 可细粒度控制(类级别 or 方法级别)

缺点:

  • 无法全局统一管理
  • 不适合大型项目

方法 2:全局配置 CORS(推荐!)

适用场景: 整个应用统一处理跨域(最常用)

方式 A:实现 WebMvcConfigurer 接口(Spring Boot 2.x+)

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 拦截所有路径
                .allowedOrigins("*")
                // .allowedOrigins("http://localhost:3000", "https://your-app.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                // .allowCredentials(true) // 是否允许携带 cookie,⚠️ 注意:这里不能同时设为 true!
                .maxAge(3600); // 预检请求缓存时间(秒)
    }
}

方式 B:使用 @Bean 注册 CorsConfigurationSource

@Configuration
public class CorsConfig {

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        // config.setAllowedOrigins(Arrays.asList("*")); // 👈 允许所有域
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
        config.setAllowedHeaders(Arrays.asList("*"));
        config.setAllowCredentials(true);
        // config.setAllowCredentials(true); // ⚠️ 不能与 "*" 同时使用!

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

优点:

  • 全局生效,配置集中
  • 灵活控制路径、方法、头部等
  • 生产环境推荐方式

方法 3:通过 Filter 自定义 CORS(底层控制)

适用场景: 需要完全自定义 CORS 响应头,或与 Spring Security 集成

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        // response.setHeader("Access-Control-Allow-Origin", "*");
        // 注意:没有 Allow-Credentials!
        
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");

        // 如果是预检请求(OPTIONS),直接返回
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
}

注意:如果使用 Spring Security,需确保此 Filter 在 Security Filter 之前执行。

优点:

  • 完全控制响应头
  • 可处理复杂逻辑(如动态 origin)

缺点:

  • 代码较繁琐
  • 容易出错(如漏掉 OPTIONS 处理)✅ 方法 4:在 application.yml / application.properties 中配置(仅限 Spring Boot 2.4+)

注意:Spring Boot 本身不支持通过配置文件直接开启 CORS! 但如果你使用 Spring Cloud Gateway 或 某些 starter,可能有扩展支持。

普通 Spring Boot Web 项目不能这样配置!

所以:不要尝试在 application.yml 里写 cors 配置(除非你用的是特定网关组件)。

场景 1:Spring WebFlux(响应式)项目

application.yml

spring:
  webflux:
    cors:
      allowed-origins: "*"
      allowed-methods: "GET,POST,PUT,DELETE,OPTIONS"
      allowed-headers: "*"
      max-age: 3600

场景 2:Spring Boot Actuator 端点的 CORS 配置

即使你用的是 Spring MVC,Actuator 的监控端点也支持通过配置文件开启 CORS:

application.yml

management:
  endpoints:
    web:
      cors:
        allowed-origins: "http://localhost:3000"
        allowed-methods: "*"
        allowed-headers: "*"
项目类型是否支持 application.yml 配置 CORS推荐方式
Spring MVCspring-boot-starter-web❌ 不支持使用 WebMvcConfigurer@CrossOrigin
Spring WebFluxspring-boot-starter-webflux✅ 支持spring.webflux.cors.*
Actuator 端点✅ 支持(仅限监控接口)management.endpoints.web.cors.*

方法 4:结合 Spring Security 配置 CORS(安全场景必备)

如果你的项目用了 Spring Security,必须显式启用 CORS,否则 Security 会拦截 OPTIONS 请求!

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .cors().and() // 👈 关键:启用 CORS 支持
            .csrf().disable()
            .authorizeHttpRequests(auth -> auth
                .anyRequest().permitAll()
            );
        return http.build();
    }

    // 同时提供全局 CorsConfigurationSource
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

为什么需要?

  • Spring Security 默认不处理 CORS
  • 如果不配置,浏览器预检请求(OPTIONS)会被 Security 拦截 → 跨域失败

常见错误

问题说明
allowedOrigins("*") + allowCredentials(true) 冲突浏览器不允许:Access-Control-Allow-Origin* 时,不能带 cookie。必须指定具体 origin
忘记处理 OPTIONS 请求预检请求失败,导致跨域报错
CORS 配置被 Security 覆盖必须在 Spring Security 中显式启用 .cors(),否则 OPTIONS 请求会被拦截
生产环境使用 allowedOrigins("*")存在安全风险,应明确指定可信的前端域名

最佳实践

场景推荐方案
快速测试 / 小型项目使用 @CrossOrigin 注解
标准 Web 项目(未集成 Spring Security)实现 WebMvcConfigurer 进行全局 CORS 配置
项目已集成 Spring Security在 Security 配置中调用 .cors(),并提供 CorsConfigurationSource Bean
需要动态 Origin(如多租户、白名单配置)自定义 CorsFilter 实现灵活控制

一句话记住:

普通项目用 WebMvcConfigurer,带 Security 的项目必须在 Security 中 .cors() 并提供 CorsConfigurationSource。

以上就是SpringBoot解决跨域的五种方式的详细内容,更多关于SpringBoot解决跨域的资料请关注脚本之家其它相关文章!

相关文章

  • 教你一步到位部署运行MyBatis3源码(保姆级)

    教你一步到位部署运行MyBatis3源码(保姆级)

    一个框架的运行流程从最简单的一个helloworld来看其源码就能了解到框架的原理是什么,这篇文章主要给大家介绍了关于如何一步到位部署运行MyBatis3源码的相关资料,需要的朋友可以参考下
    2022-06-06
  • Mybatis有查询结果但存不进实体类的解决方案

    Mybatis有查询结果但存不进实体类的解决方案

    这篇文章主要介绍了Mybatis有查询结果但存不进实体类的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 修改IDEA代码左侧折叠线颜色的操作

    修改IDEA代码左侧折叠线颜色的操作

    这篇文章主要介绍了修改IDEA代码左侧折叠线颜色的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Spring Boot 如何使用Liquibase 进行数据库迁移(操作方法)

    Spring Boot 如何使用Liquibase 进行数据库迁移(操作方法)

    在Spring Boot应用程序中使用Liquibase进行数据库迁移是一种强大的方式来管理数据库模式的变化,本文重点讲解如何在Spring Boot应用程序中使用Liquibase进行数据库迁移,从而更好地管理数据库模式的变化,感兴趣的朋友跟随小编一起看看吧
    2023-09-09
  • java数据结构实现双向链表功能

    java数据结构实现双向链表功能

    这篇文章主要为大家详细介绍了java数据结构实现双向链表功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 解决因缺少Log4j依赖导致应用启动失败的问题

    解决因缺少Log4j依赖导致应用启动失败的问题

    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。但这篇文章不是介绍Log4j,这篇文章主要介绍了关于因缺少Log4j依赖导致应用启动失败问题的相关资料,需要的朋友可以参考下。
    2017-04-04
  • springboot如何查找配置文件路径的顺序和其优先级别

    springboot如何查找配置文件路径的顺序和其优先级别

    此文是在工作中遇到的关于springboot配置文件的问题,在网上查阅资料和自己测试之后记录的,以便日后查阅。希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Mybatis-Plus中的@TableName 和 table-prefix使用

    Mybatis-Plus中的@TableName 和 table-prefix使用

    table-prefix 是一个全局配置,它会自动在所有表名前添加指定的前缀,这个配置对于那些使用一致命名约定的数据库表非常有用,这篇文章主要介绍了Mybatis-Plus中的@TableName 和 table-prefix使用,需要的朋友可以参考下
    2024-08-08
  • JAVA中的日期LocalDate类详细用法讲解

    JAVA中的日期LocalDate类详细用法讲解

    Java中存在一个日历表示法的类库,LocalDate类,如果只想要指定的年月日就可以用这个LocalDate类,下面这篇文章主要给大家介绍了关于JAVA中日期LocalDate类详细用法讲解的相关资料,需要的朋友可以参考下
    2024-01-01
  • java中pdf转图片的实现方法

    java中pdf转图片的实现方法

    下面小编就为大家带来一篇java中pdf转图片的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论