我使用的是实体类自动启动的Spring Boot API RESTful。我从前端Web应用程序中消耗了这个apiRest,但它给了我这个错误:
请求的资源
上没有'Access-Control-Allow-Origin'标头
我正在使用指定的{appntion.properties here设置CORS配置。
我的基本配置是:
endpoints.cors.allow-credentials=true
endpoints.cors.allowed-origins=*
endpoints.cors.allowed-methods=*
endpoints.cors.allowed-headers=*
我在这些变量中尝试过不同的组合,但仍无效。有什么想法吗?
答案 0 :(得分:21)
我自己得到了答案:
只需将其添加到application.java
即可 @Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
}
};
}
答案 1 :(得分:20)
这在官方的Spring文档中并不是很清楚,并且很容易被官方的Spring Boot文档误导linked here
事实是, CAN NOT 使用application.properties文件设置全局CORS配置。您必须按照here所述使用JavaConfig。
只需在扩展@EnableWebMvc
的{{1}}类上使用@Configuration
注释,并覆盖WebMvcConfigurerAdapter
方法,如下所示:
addCorsMappings
答案 2 :(得分:9)
Actuator使用以 endpoints.cors。* 为前缀的Spring引导属性,这就是为什么它不适用于MVC端点。
答案 3 :(得分:3)
我们仍然可以将与cors相关的实际网址移至application.properties。它适用于Spring Boot 5。
App.java(主类):
@SpringBootApplication
public class App extends SpringBootServletInitializer {
@Autowired
private Environment env;
public static void main(String[] args) {
SpringApplication.run(ReportsApplication.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
String urls = env.getProperty("cors.urls");
CorsRegistration reg = registry.addMapping("/api/**");
for(String url: urls.split(",")) {
reg.allowedOrigins(url);
}
}
};
}
}
application.properties:
cors.urls=http://localhost:3000
答案 4 :(得分:1)
在spring boot2中它甚至很简单,只需在这样的管理执行器中指定跨域URL
management.endpoints.web.cors.allowed-origins=http://examaple.com ,http://examaple1.com
management.endpoints.web.cors.allowed-methods=GET, POST
答案 5 :(得分:0)
已通过Spring-Boot 2.1.2进行检查:
第一件事是知道已经使用了哪些servlet过滤器。 Servlet过滤器应该添加响应标头“ Access-Control-Allow-Origin”。我在Spring日志中查找并决定添加最初来自Spring的CorsFilter。
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("http://127.0.0.1:4200");
config.addAllowedOrigin("http://localhost:4200");
config.addAllowedHeader("*");
config.setAllowedMethods(Arrays.asList("OPTIONS", "GET"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/actuator/**", config);
return new CorsFilter(source);
}
由于您正在注入CorsFilter-您可以轻松查看其中发生了什么。在这种情况下-我们要击中“ / actuator / **”以外的其他端点。没有可用的配置。
以上(空)并不表示将不显示“ Access-Control-Allow-Origin”。可以通过我们注入的其他过滤器添加它(例如,如果您的控制器带有@CrossOrigin注释-跨域标头将添加到除CorsFilter之外的其他某些mvc过滤器中)。
在以下情况下,我们点击/ actuator:
您还可以创建自己的自定义过滤器,以将标头添加到http-response。我认为最好使用标准方法,但是在某些调试情况下,通过在文件管理器中添加一行可能会很方便-您可以添加所需的代码。
response.addHeader("Access-Control-Allow-Origin", "*");
请注意,上面没有包含先前提供的条件检查。
希望这会有所帮助。干杯
答案 6 :(得分:0)
如果要将字符串保存在application.properties中,则可以插入字符串
# Clients
appName.developmentUrl=http://localhost:4200
appName.productionUrl=https://appname.com
在您的WebConfig.java
中@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Value("${appName.developmentUrl}")
private String devUrl;
@Value("${appName.productionUrl}")
private String prodUrl;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins(devUrl, prodUrl);
}
}
答案 7 :(得分:0)
使用@CrossOrigin
注释针对特定控制器执行此操作的一种解决方案是:
在控制器类中:
@CrossOrigin(origins = "${client.url}")
@Controller
@RequestMapping(path = "/foo")
public class FooController {
...
}
在application.properties中:
# Client URL
client.url=http://localhost:4200
答案 8 :(得分:0)
值得一提的是,在较新版本的 spring 中,您可以使用 allowedOriginsPattrens
构建器方法为允许的来源添加模式。在这种情况下,您无需严格提供来源:
public class YourConfig implements WebMvConfigurer {
(...)
public void addCorsMapping(Corsregistry registry) {
registry.addMapping(""/your/endpoints/root/**)
.allowCredentials(true)
.allowedOriginsPatterns("*.your.domain1.com", "*.your.domain2.com)
.allowHeaders("*")
.allowMethods("*");
}
}