我有Spring Boot应用程序,部署到许多环境中,因此需要设置多个CORS源,以便从我们的Web应用程序访问。
这本身不是问题,因为我可以在@CrossOrigin
注释中提供逗号分隔的域列表。我还有一些控制器不应该被我们的Web应用程序访问,所以这些控制器根本不会被@CrossOrigin
注释。
例如,这是我的CarController
需要此注释和PartController
不需要它:
@CrossOrigin(origins = {"domain1", "domain2", "domain3, ..."})
@RestController
@RequestMapping("/v1/cars")
public class CarController {
...
}
@RestController
@RequestMapping("/v1/parts")
public class PartController {
...
}
由于此列表很长,我想将上述域移动到application.properties:
allowed.cors.origins=domain1,domain2,domain3,domain4, ....,domain10
我知道我可以在类中使用@Value(…)
来获取allowed.cors.origins
属性中设置的值。但是,当在我的控制器上使用像@CrossOrigin
这样的注释时,我不能这样做。
如何使用上面application.propertiesCarsController的@CrossOrigin
注释中的文件中的值?
我的解决方案
我接受了@birca123的以下回答,但我没有使用或测试它,但它是有意义的,它可能对一些人有用。然而,我发现实际上可以在注释中引用application.properties设置,如@CrossOrigin
。Spring Boot启用application.propertiesCORS很有帮助,所以我在下面提供了我现在使用的解决方案。
在我的application.properties设置变量:
allowed.cors.origins=https://somedomain.com
然后您可以在代码和注释中获取此属性,如下所示。
在代码中,使用@Value
,例如:
@Value("${allowed.cors.origins}")
private List<String> allowedCorsOrigins;
在@CrossOrigin
注释中,如:
@CrossOrigin(origins = "${allowed.cors.origins}")
所以,现在我的控制器看起来像:
@CrossOrigin(origins = "${allowed.cors.origins}")
@RestController
@RequestMapping("/v1/cars")
public class CarController {
...
}
请注意,我意识到我不需要多个域,所以我远离了它,但它应该以同样的方式工作。我使用@Value("${allowed.cors.origins}")私有列表对其进行了测试
创建一个全局CORS配置,如下所示,而不是使用@CrossOrigin
注释控制器。可以声明多个CORS映射以涵盖所有需要跨域请求处理的endpoint。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Value("${allowed.cors.origins}")
String[] allowedOrigins;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/v1/cars/**")
.allowedMethods("*")
.allowedHeaders("*")
.allowedOrigins(allowedOrigins);
registry
.addMapping("/another-cors-mapping/**")
.allowedMethods("*")
.allowedHeaders("*")
.allowedOrigins(allowedOrigins);
// Add more mappings...
}
}
参考:Spring文档-CORS-全局配置