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

Spring Boot如何将配置文件值传入@CrossOrigin注解的origins参数

Spring Boot @CrossOrigin读取配置文件值失效的问题解决

问题原因

@CrossOrigin注解的origins参数要求是编译时常量,直接写{"${app.cors.origins}"}时,Spring不会解析这个占位符,而是将其当作一个字面量字符串(即"${app.cors.origins}")作为允许的跨域源,这显然和你配置的URL不符,所以跨域请求会失败。硬编码URL时是直接传入合法的常量字符串,因此能正常工作。

解决方法

方法一:全局CORS配置(推荐,更灵活)

通过配置类统一管理跨域规则,支持从配置文件读取并解析多源地址:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Value("${app.cors.origins}")
    private String corsOrigins;

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        
        // 拆分配置中的多个跨域源,去除可能的空格
        String[] origins = corsOrigins.split(",");
        for (String origin : origins) {
            config.addAllowedOrigin(origin.trim());
        }
        
        // 允许所有请求方法和请求头
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        // 对所有接口生效
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

配置完成后,无需在Controller类上添加@CrossOrigin注解,全局规则会自动生效。如果需要针对特定接口做差异化配置,可以修改registerCorsConfiguration的路径参数。

方法二:使用SpEL表达式在@CrossOrigin中解析配置

如果坚持要在Controller上使用@CrossOrigin,可以通过Spring表达式语言(SpEL)解析并拆分配置值:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RestController;

@CrossOrigin(origins = "#{'${app.cors.origins}'.split(',').stream().map(String::trim).toArray(String[]::new)}")
@RestController
public class SomeController {
    // 接口实现
}

注意:

  • 确保你的Spring版本支持在@CrossOrigin的origins参数中使用复杂SpEL表达式;
  • 配置文件中的地址尽量不要加空格,或者通过map(String::trim)去除拆分后字符串的首尾空格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:10:40