浅析SpringBoot如何解决CORS问题

 更新时间:2025年05月09日 09:41:14   作者:来自星星的坤  
在前后端分离的开发模式中,经常会遇到 跨域资源共享(CORS) 的问题,本文将全面介绍 Spring Boot 中处理 CORS 的常见方法,大家可以根据需要进行选择

在前后端分离的开发模式中,前端调用后端接口时,经常会遇到 跨域资源共享(CORS) 的问题。Spring Boot 作为常用的后端框架,提供了多种方式来优雅地解决这个问题。本文将全面介绍 Spring Boot 中处理 CORS 的常见方法、原理分析及注意事项,帮助开发者高效排查和解决跨域问题。

一、什么是 CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享)是浏览器的一种安全策略,用于防止页面被恶意地从一个域加载资源到另一个域。简单来说,只要前端请求的协议、域名、端口与后端接口不完全一致,就属于跨域请求。

例如:

  • 前端地址:http://localhost:3000
  • 后端接口:http://localhost:8080/api/data

这就构成了跨域请求,浏览器会默认拦截这类请求,除非服务器端明确允许跨域访问。

二、Spring Boot 中解决 CORS 的几种方法

Spring Boot 提供了多种方式来配置和处理跨域问题,以下是最常用的三种方法:

方法一:使用 @CrossOrigin 注解(推荐用于小型项目或测试)

这是 Spring Boot 提供的快捷方式,可直接作用于控制器类或方法上:

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:3000")
public class MyController {
 
    @GetMapping("/data")
    public String getData() {
        return "Hello, CORS!";
    }
}

参数说明:

origins:允许的域名(可为 * 表示所有)。

methods:允许的方法,如 GET, POST 等。

maxAge:预检请求的有效时间(单位秒)。

allowedHeaders:允许携带的头信息。

缺点:对于中大型项目来说,控制器众多,维护成本高。

方法二:全局 CORS 配置(推荐用于中大型项目)

通过实现 WebMvcConfigurer 接口,全局统一配置跨域规则,适用于大多数项目场景。

@Configuration
public class CorsConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 所有接口
                .allowedOrigins("http://localhost:3000") // 允许的前端地址
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的方法
                .allowedHeaders("*") // 允许的请求头
                .allowCredentials(true) // 允许携带 Cookie
                .maxAge(3600); // 预检请求缓存时间(秒)
    }
}

优点:配置集中,维护简单,推荐使用。

方法三:通过 Filter 手动设置响应头(不推荐,除非特殊需求)

手动注册一个过滤器,向响应中添加 CORS 相关头信息:

@Component
public class CorsFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletResponse res = (HttpServletResponse) response;
        HttpServletRequest req = (HttpServletRequest) request;
 
        res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "*");
        res.setHeader("Access-Control-Allow-Credentials", "true");
 
        // OPTIONS 预检请求直接返回
        if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(request, response);
        }
    }
}

缺点:易出错,不易维护,建议使用 WebMvcConfigurer 方式代替。

三、常见问题排查

OPTIONS 请求返回 403 或没有响应?

确保后端允许 OPTIONS 方法。

确保没有被 Spring Security 拦截。

携带 Cookie 不生效?

后端必须设置:.allowCredentials(true)

前端必须设置:axios.defaults.withCredentials = true

Spring Security 拦截 CORS 请求?

需要额外配置 CORS 策略,示例如下:

@EnableWebSecurity
public class SecurityConfig {
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .cors() // 启用 CORS
            .and()
            .csrf().disable()
            .authorizeHttpRequests()
            .anyRequest().permitAll();
 
        return http.build();
    }
 
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(List.of("http://localhost:3000"));
        config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowedHeaders(List.of("*"));
        config.setAllowCredentials(true);
 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

四、总结

方法场景推荐度
@CrossOrigin 注解控制器少,接口固定⭐⭐
实现 WebMvcConfigurer中大型项目,统一配置⭐⭐⭐⭐⭐
自定义 Filter特殊需求(如动态域)

CORS 配置看似简单,但与前端请求设置、Spring Security 配合使用时需格外注意。建议在项目初始化阶段就进行统一的跨域策略设计,避免后续频繁调整。

到此这篇关于浅析SpringBoot如何解决CORS问题的文章就介绍到这了,更多相关SpringBoot解决CORS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java选择排序和垃圾回收机制详情

    Java选择排序和垃圾回收机制详情

    这篇文章主要介绍Java选择排序和垃圾回收机制,创建对象就会占据内存,如果程序在执行过程中不能再使用某个对象,这个对象是徒耗内存的垃圾,下面来看看文章具体内容吧
    2021-10-10
  • SpringBoot实现HTTP调用的七种方式总结

    SpringBoot实现HTTP调用的七种方式总结

    小编在工作中,遇到一些需要调用三方接口的任务,就需要用到 HTTP 调用工具,这里,我总结了一下 实现 HTTP 调用的方式,共有 7 种(后续会继续新增),需要的朋友可以参考下
    2023-09-09
  • springboot启动前执行方法的四种方式总结

    springboot启动前执行方法的四种方式总结

    这篇文章主要给大家介绍了关于springboot启动前执行方法的四种方式,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 详解SpringBoot中的tomcat优化和修改

    详解SpringBoot中的tomcat优化和修改

    这篇文章主要介绍了详解SpringBoot中的tomcat优化和修改,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring配置使用之Bean生命周期详解

    Spring配置使用之Bean生命周期详解

    这篇文章主要介绍了Spring配置使用之Bean生命周期详解,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 如何优雅的替换掉Java代码中的if else

    如何优雅的替换掉Java代码中的if else

    这篇文章主要介绍了如何优雅的替换掉Java代码中的if else,帮助大家优化自己的Java代码,提高可读性与简洁性,感兴趣的朋友可以了解下
    2020-09-09
  • 用SpringBoot Admin监控SpringBoot程序

    用SpringBoot Admin监控SpringBoot程序

    这篇文章主要介绍了用SpringBoot Admin监控SpringBoot程序,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • Java ApiPost请求返回406状态码问题的解决方案

    Java ApiPost请求返回406状态码问题的解决方案

    APIPost是一款专为开发者和测试人员设计的API测试工具,类似于Postman,但提供了更多的团队协作和文档管理功能,它可以帮助你更好地进行接口调试和集成测试,但遇到了请求后返回的是406状态,所以本文给大家介绍了Java ApiPost请求返回406状态码问题的解决方案
    2025-04-04
  • Java调用微信客服消息实现发货通知的方法详解

    Java调用微信客服消息实现发货通知的方法详解

    这篇文章主要介绍了Java调用微信客服消息实现发货通知的方法,结合实例形式详细分析了java针对微信接口调用的原理、调用方法与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • Java面向对象之final关键字详细解读

    Java面向对象之final关键字详细解读

    这篇文章主要介绍了Java面向对象之final关键字详细解读,final修饰的属性又叫常量,一般用 XX_XX_XX来命名,final修饰的属性在定义时必须赋初始值,并且以后不能再修改,需要的朋友可以参考下
    2024-01-01

最新评论