SpringBoot项目解决跨域的5种实现过程

 更新时间:2026年05月13日 16:43:47   作者:油墨香^_^  
本文介绍了SpringBoot项目中解决跨域问题的5种方式,包括使用@CrossOrigin注解、全局配置WebMvcConfigurer、使用CorsFilter过滤器、WebFlux配置和手动配置过滤器,推荐使用全局配置WebMvcConfigurer,因为它既统一又灵活,适合大多数项目场景

在SpringBoot项目中,解决跨域问题主要有以下5种方式:

1. 使用@CrossOrigin注解

在Controller类或方法上添加注解

// 在类级别使用 - 该类所有接口都支持跨域
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api")
public class UserController {
    // 在方法级别使用 - 仅此方法支持跨域
    @CrossOrigin(origins = "http://localhost:3000")
    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.findAll();
    }
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }
}

@CrossOrigin参数说明

@CrossOrigin(
    origins = "*",                    // 允许的源
    allowedHeaders = "*",             // 允许的请求头
    methods = {RequestMethod.GET, RequestMethod.POST}, // 允许的HTTP方法
    allowCredentials = "true",        // 是否允许证书
    maxAge = 3600                     // 预检请求缓存时间
)

2. 全局配置 - 实现WebMvcConfigurer

方式一:配置类方式

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 对所有接口路径
                .allowedOriginPatterns("*")  // 支持域匹配,SpringBoot 2.4+
                // .allowedOrigins("*")      // SpringBoot 2.4之前版本使用
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

方式二:配置文件方式

# application.yml
spring:
  mvc:
    cors:
      allowed-origins: "*"
      allowed-methods: GET,POST,PUT,DELETE,OPTIONS
      allowed-headers: "*"
      allow-credentials: true
      max-age: 3600

3. 使用CorsFilter过滤器

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        // 1. 创建CORS配置对象
        CorsConfiguration config = new CorsConfiguration();
        // 2. 配置CORS规则
        config.addAllowedOriginPattern("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setAllowCredentials(true);
        config.setMaxAge(3600L);
        // 3. 添加映射路径
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

4. 使用WebFlux配置(响应式编程)

如果使用WebFlux,可以这样配置:

@Configuration
public class CorsWebFluxConfig {
    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOriginPattern("*");
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        config.setAllowCredentials(true);
        config.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

5. 手动配置过滤器

@Component
public class SimpleCorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        // 设置CORS头部
        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");
        // 处理预检请求
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
    @Override
    public void init(FilterConfig filterConfig) {}
    @Override
    public void destroy() {}
}

生产环境推荐配置

@Configuration
public class ProductionCorsConfig implements WebMvcConfigurer {
    @Value("${cors.allowed-origins:*}")
    private String[] allowedOrigins;
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOriginPatterns(allowedOrigins)
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("Authorization", "Content-Type", "X-Requested-With")
                .exposedHeaders("X-Custom-Header")
                .allowCredentials(true)
                .maxAge(1800); // 30分钟
        // 管理接口特殊配置
        registry.addMapping("/admin/**")
                .allowedOriginPatterns("https://admin.example.com")
                .allowedMethods("GET", "POST")
                .allowCredentials(true);
    }
}

配置说明文件

# application-prod.yml
cors:
  allowed-origins: 
    - "https://www.example.com"
    - "https://api.example.com"

总结对比

方式适用场景优点缺点
@CrossOrigin单个接口或控制器精确控制,简单易用重复配置,不够统一
WebMvcConfigurer全局配置统一管理,配置灵活需要创建配置类
CorsFilter过滤器级别处理更底层,性能较好配置相对复杂
WebFlux配置响应式应用专为WebFlux设计仅适用于响应式
手动过滤器完全自定义最大灵活性需要手动处理所有细节

推荐使用全局配置(WebMvcConfigurer),因为它既统一又灵活,适合大多数项目场景。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

    Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

    对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?很多朋友对这一问题不是很清楚,今天小编给大家带来一篇教程关于Fluent Mybatis如何做到代码逻辑和sql逻辑的合一,一起看看吧
    2021-08-08
  • Seata AT模式TransactionHook被删除探究

    Seata AT模式TransactionHook被删除探究

    这篇文章主要为大家介绍了Seata AT模式TransactionHook被删除探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java中String判断值为null或空及地址是否相等的问题

    Java中String判断值为null或空及地址是否相等的问题

    这篇文章主要介绍了Java中String判断值为null或空及地址是否相等的问题,文中举了简单的例子对字符串类型的值和地址问题进行讲解,需要的朋友可以参考下
    2016-01-01
  • Java 实战练手项目之校园超市管理系统的实现流程

    Java 实战练手项目之校园超市管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+Mysql+Maven+Bootstrap实现一个校园超市管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • 利用Java编写一个出敬业福的小程序

    利用Java编写一个出敬业福的小程序

    新年将至,又开始扫福活动,每年的敬业福成了大家难过的坎。所以本文将介绍一个通过Java编写的一款福字生成器,感兴趣的小伙伴可以试一试
    2022-01-01
  • Java用itextpdf导出PDF方法(通俗易懂)

    Java用itextpdf导出PDF方法(通俗易懂)

    因为项目需要导出PDF文件,所以去找了一下能够生成PDF的java工具,这篇文章主要给大家介绍了关于Java用itextpdf导出PDF的相关资料,文中介绍的方法通俗易懂,需要的朋友可以参考下
    2023-07-07
  • SpringMVC中Model和ModelAndView的EL表达式取值方法

    SpringMVC中Model和ModelAndView的EL表达式取值方法

    下面小编就为大家分享一篇SpringMVC中Model和ModelAndView的EL表达式取值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • javax.servlet不存在的解决办法

    javax.servlet不存在的解决办法

    今天在关于servlet的编译中出现了一下小小的错误,发现javax.servlet不存在,本文就介绍一下解决方法,感兴趣的可以了解一下
    2021-07-07
  • Springboot整合EasyExcel实现Excel文件上传方式

    Springboot整合EasyExcel实现Excel文件上传方式

    这篇文章主要介绍了Springboot整合EasyExcel实现Excel文件上传方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • @RequestParam 参数偶尔丢失的解决

    @RequestParam 参数偶尔丢失的解决

    这篇文章主要介绍了@RequestParam 参数偶尔丢失的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论