You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Spring Boot 3(含Spring MVC&Security7)实现带凭证的CORS公开访问

Spring Boot 3 + Spring Security 满足指定CORS需求的最佳配置方案

一、核心配置实现

1. CORS全局配置类

创建全局CORS配置Bean,适配Spring Boot 3的API规范,同时满足允许所有主机、支持凭证的要求:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

@Configuration
public class CorsConfig {

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        // 允许所有来源(符合CORS规范,支持凭证时不能直接用addAllowedOrigin("*"))
        config.addAllowedOriginPattern("*");
        // 允许所有HTTP请求方法
        config.addAllowedMethod("*");
        // 允许所有请求头
        config.addAllowedHeader("*");
        // 开启凭证支持(适配Bearer令牌等场景)
        config.setAllowCredentials(true);
        // 暴露前端需要获取的响应头(如Authorization)
        config.addExposedHeader("Authorization");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对所有API路径应用该配置
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

2. Spring Security 过滤链配置

将CORS过滤器加入Security过滤链,确保CORS校验优先于其他Security规则执行:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfigurationSource;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final CorsConfigurationSource corsConfigurationSource;

    public SecurityConfig(CorsConfigurationSource corsConfigurationSource) {
        this.corsConfigurationSource = corsConfigurationSource;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // 优先配置CORS,必须放在csrf、权限控制之前
                .cors(cors -> cors.configurationSource(corsConfigurationSource))
                // 关闭CSRF(按需求配置)
                .csrf(csrf -> csrf.disable())
                // 按需配置权限规则,示例为允许所有请求,实际请根据业务调整
                .authorizeHttpRequests(auth -> auth
                        .anyRequest().permitAll()
                );

        return http.build();
    }
}

二、关键注意事项

  • addAllowedOriginPattern vs addAllowedOrigin:当开启凭证支持(setAllowCredentials(true))时,CORS规范禁止使用Access-Control-Allow-Origin: *,因此必须用addAllowedOriginPattern("*")来实现允许所有来源同时兼容凭证的需求,这是Spring Boot 3适配规范的新写法。
  • 过滤链顺序:CORS配置必须在Security的csrf、权限控制之前声明,否则请求会被Security先拦截,导致CORS响应头无法正确返回。

三、集中配置 vs 方法/控制器注解的选择

1. 集中配置(优先推荐)

适合常规API场景:

  • 统一管理所有API的CORS规则,避免重复代码,维护成本极低。
  • 适配本题中"允许公开通用访问"的需求,一次配置覆盖所有路径。
  • 规则变更时只需修改一处,无需逐个调整控制器。

2. 注解方式(@CrossOrigin)

适合特殊场景:

  • 当个别API需要自定义CORS规则(比如仅允许特定域名访问)时,可在控制器或方法上添加@CrossOrigin注解,注解配置会覆盖全局规则。
  • 适合快速测试或局部调整,但大量使用会导致代码冗余,不利于统一维护。

总结:常规API优先采用集中配置,特殊需求API结合@CrossOrigin做局部调整即可。

内容的提问来源于stack exchange,提问作者Jules

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:27:39