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

Spring Boot中@CrossOrigin多跨域URL配置失效问题

嘿,我刚好遇到过类似的问题,来帮你排查下!

你遇到的核心问题其实是配置中的空格导致注入的URL数组带多余空格,进而跨域匹配失败。具体来说:

  • 当配置单个URL时(比如app.api.settings.cross-origin.urls=http://localhost:3000),Spring Boot能正确把值注入到@CrossOrigin的origins数组里,没有多余字符,跨域规则自然生效。
  • 但配置多个URL时如果加了逗号+空格(比如http://localhost:3000, http://localhost:7070),Spring Boot自动拆分字符串为数组后,第二个元素会变成" http://localhost:7070"(前面带空格)。而浏览器发送的Origin请求头是不带空格的,两者不匹配,导致跨域规则直接失效。

下面给你几种优先级不同的解决方案:

方案1:最简单的修正——去掉配置中的空格

直接修改application.properties,把逗号后的空格删掉:

app.api.settings.cross-origin.urls=http://localhost:3000,http://localhost:7070

之后你就可以直接在控制器上使用:

@CrossOrigin(origins = "${app.api.settings.cross-origin.urls}")
@RestController
@RequestMapping("/your-api")
public class YourController {
    // 接口方法...
}

这样Spring Boot会自动把逗号分隔的字符串拆分成干净的URL数组,完美匹配请求的Origin。

方案2:保留配置空格,用全局配置处理(更优雅)

如果不想修改配置格式,推荐用全局CORS配置类来统一处理空格,所有接口都能复用规则:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Arrays;

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {

    @Value("${app.api.settings.cross-origin.urls}")
    private String[] allowedOrigins;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 先把数组里的每个URL去掉前后空格
        String[] cleanedOrigins = Arrays.stream(allowedOrigins)
                                       .map(String::trim)
                                       .toArray(String[]::new);

        registry.addMapping("/**") // 匹配所有接口路径,可根据需求调整
                .allowedOrigins(cleanedOrigins)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的请求方法
                .allowedHeaders("*") // 允许所有请求头
                .allowCredentials(true); // 如果需要携带Cookie,打开这个配置
    }
}

用这个全局配置后,就不需要在每个控制器上加@CrossOrigin注解了,适合多接口的项目。

方案3:用SpEL表达式在@CrossOrigin中直接处理

如果你只想在单个控制器/方法上处理,可以用Spring表达式(SpEL)直接在注解里拆分并trim:

@CrossOrigin(origins = "#{'${app.api.settings.cross-origin.urls}'.split(',').stream().map(s -> s.trim()).toArray(String[]::new)}")
@RestController
@RequestMapping("/your-api")
public class YourController {
    // 接口方法...
}

这种方式比较直接,但表达式有点长,适合小范围使用。

你也可以在代码里打印下注入的allowedOrigins数组(比如System.out.println(Arrays.toString(allowedOrigins));),直观验证是不是带空格的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:00:31