Spring框架中的跨域CORS配置的完整教学

 更新时间:2025年10月31日 09:08:49   作者:匆匆忙忙游刃有余  
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种机制,允许在浏览器中向不同源(域名、协议或端口不同)的服务器发起请求,下面我们就来看看如何在Spring框架配置跨域CORS吧

什么是跨域CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种机制,允许在浏览器中向不同源(域名、协议或端口不同)的服务器发起请求。在Web开发中,出于安全考虑,浏览器会实施同源策略(Same-Origin Policy),限制从一个源加载的文档或脚本与另一个源的资源进行交互。CORS机制提供了一种安全的方式来实现跨域访问。

Spring中的CORS配置方法

1. 全局CORS配置

使用WebMvcConfigurer配置

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 允许所有路径
                .allowedOrigins("*")  // 允许所有来源,生产环境应限制具体域名
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")  // 允许的HTTP方法
                .allowedHeaders("*")  // 允许所有请求头
                .exposedHeaders("Authorization")  // 暴露的响应头
                .allowCredentials(true)  // 允许携带凭证(cookie)
                .maxAge(3600);  // 预检请求结果缓存时间(秒)
    }
}

Spring Boot 2.7+ 方式

从Spring Boot 2.7开始,推荐使用CorsFilter而不是WebMvcConfigurer

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        
        // 设置允许的源
        config.addAllowedOrigin("*");
        // 设置允许的HTTP方法
        config.addAllowedMethod("*");
        // 设置允许的请求头
        config.addAllowedHeader("*");
        // 设置允许携带凭证
        config.setAllowCredentials(true);
        // 设置暴露的响应头
        config.addExposedHeader("Authorization");
        // 设置预检请求结果缓存时间
        config.setMaxAge(3600L);
        
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

2. 控制器级别CORS配置

使用@CrossOrigin注解可以在控制器类或方法级别配置CORS:

// 控制器类级别配置
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*", maxAge = 3600)
public class ApiController {
    
    @GetMapping("/data")
    public ResponseEntity<String> getData() {
        return ResponseEntity.ok("Data response");
    }
}

// 方法级别配置
@RestController
@RequestMapping("/api")
public class ApiController {
    
    @GetMapping("/data")
    @CrossOrigin(origins = "http://localhost:3000", 
                allowedHeaders = "*",
                methods = {RequestMethod.GET, RequestMethod.POST})
    public ResponseEntity<String> getData() {
        return ResponseEntity.ok("Data response");
    }
}

3. 基于过滤器的CORS配置

@Component
public class CorsFilter extends OncePerRequestFilter {
    
    @Override
    protected void doFilterInternal(HttpServletRequest request, 
                                    HttpServletResponse response, 
                                    FilterChain filterChain) throws ServletException, IOException {
        
        // 设置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-Expose-Headers", "Authorization");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        
        // 处理预检请求
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        
        filterChain.doFilter(request, response);
    }
}

Spring Security环境下的CORS配置

当使用Spring Security时,CORS配置需要与Security配置集成:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 添加CORS配置
            .cors().and()
            // 禁用CSRF(如果需要)
            .csrf().disable()
            // 其他安全配置...
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated();
    }
    
    // 注入CORS配置Bean
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setExposedHeaders(Arrays.asList("Authorization"));
        configuration.setAllowCredentials(true);
        configuration.setMaxAge(3600L);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

生产环境CORS最佳实践

限制允许的源:不要在生产环境使用"*"通配符,而应该指定具体的前端域名:

config.setAllowedOrigins(Arrays.asList("https://www.example.com", "https://app.example.com"));

谨慎使用credentials:如果设置了allowCredentials = trueallowedOrigins不能使用"*"通配符。

限制允许的HTTP方法:只允许应用程序需要的HTTP方法,而不是全部:

config.setAllowedMethods(Arrays.asList("GET", "POST"));

限制允许的请求头:只允许必要的请求头,提高安全性。

设置适当的maxAge:避免频繁的预检请求,减少服务器负担。

常见问题及解决方案

CORS策略阻止了请求

  • 检查服务器是否正确设置了Access-Control-Allow-Origin
  • 确保请求的方法和头在允许列表中

预检请求失败

  • 确保服务器正确处理了OPTIONS请求
  • 检查是否配置了maxAge参数

凭证模式的问题

  • 当使用withCredentials: true时,服务端必须指定明确的Access-Control-Allow-Origin
  • 不能使用通配符*

通过以上配置方法,可以根据项目需求灵活地实现Spring应用中的CORS支持,确保前端应用能够安全地进行跨域资源访问。

到此这篇关于Spring框架中的跨域CORS配置的完整教学的文章就介绍到这了,更多相关Spring 跨域CORS配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Jetbrains系列产品重置试用思路详解

    Jetbrains系列产品重置试用思路详解

    这篇文章主要介绍了Jetbrains系列产品重置试用思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • SpringBoot整合Keycloak的项目实践

    SpringBoot整合Keycloak的项目实践

    本文介绍了如何设置了Keycloak 服务器及在SpringBoot中使用 Spring Security OAuth2.0结合Keycloak实现认证和授权,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • 在Spring Boot中使用Spring-data-jpa实现分页查询

    在Spring Boot中使用Spring-data-jpa实现分页查询

    如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式。具体实例代码大家参考下本文吧
    2017-07-07
  • 使用Java实现通用树形结构构建工具类

    使用Java实现通用树形结构构建工具类

    这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    这篇文章主要为大家详细介绍了如何利用Java编写一个工具类,可以实现一键获取Mysql所有表字段设计和建表语句,感兴趣的小伙伴可以了解一下
    2023-05-05
  • SpringBoot集成语音识别模型FunASR的过程详解

    SpringBoot集成语音识别模型FunASR的过程详解

    文章介绍了在SpringBoot中集成FunASR语音识别模型的实践,重点解决Java客户端兼容性问题、Docker部署参数配置及序列化异常,最终实现模型成功运行并处理识别结果,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)

    Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)

    这篇文章主要介绍了Eclipse+Java+Swing+Mysql实现电影购票系统并附详细的代码详解,需要的小伙伴可以参考一下
    2022-01-01
  • SpringBoot配置文件properties和yml的实现

    SpringBoot配置文件properties和yml的实现

    本文主要介绍了SpringBoot配置文件properties和yml的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • JBoss5.x下配置Log4j方法介绍

    JBoss5.x下配置Log4j方法介绍

    这篇文章主要介绍了JBoss5.x下配置Log4j方法介绍,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • Java中使用数组实现栈数据结构实例

    Java中使用数组实现栈数据结构实例

    这篇文章主要介绍了Java中使用数组实现栈数据结构实例,本文先是讲解了实现栈至少应该包括以下几个方法等知识,然后给出代码实例,需要的朋友可以参考下
    2015-01-01

最新评论