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
相关产品推荐
相关产品推荐

