Spring Boot通过application.properties启用CORS

时间:2017-03-18 12:22:17

标签: spring-boot cors

我使用的是实体类自动启动的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=*

我在这些变量中尝试过不同的组合,但仍无效。有什么想法吗?

9 个答案:

答案 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 / **”以外的其他端点。没有可用的配置。

enter image description here

以上(空)并不表示将不显示“ Access-Control-Allow-Origin”。可以通过我们注入的其他过滤器添加它(例如,如果您的控制器带有@CrossOrigin注释-跨域标头将添加到除CorsFilter之外的其他某些mvc过滤器中)。

在以下情况下,我们点击/ actuator:

enter image description here

您还可以创建自己的自定义过滤器,以将标头添加到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("*");
   }
}