【问题标题】:Spring Boot enabling CORS by application.propertiesSpring Boot 通过 application.properties 启用 CORS
【发布时间】:2017-08-10 00:06:38
【问题描述】:

我使用由您的实体类自动启动的 Spring Boot API RESTful。我正在从前端网络应用程序中使用这个 apiRest,但它给了我这个错误:

请求的资源上没有“Access-Control-Allow-Origin”标头

我正在使用指定的申请属性设置 CORS 配置 here

我的基本配置是:

endpoints.cors.allow-credentials=true
endpoints.cors.allowed-origins=*
endpoints.cors.allowed-methods=*
endpoints.cors.allowed-headers=*

我在这些变量中尝试了不同的组合,但仍然无法正常工作。有什么想法吗?

【问题讨论】:

    标签: spring-boot cors


    【解决方案1】:

    在 application.property 文件中添加来源和标题。确保逗号后没有空格。

    allowed.origins = http://localhost:3000,http://192.168.00.00:3000,http://servername:3000
    allowed.headers = Content-Type,Authorization,loggedInUserId,Cache-Control,Pragma,Expires
    

    WebMvcConfigurer 实现文件

    @Configuration
    public class WebConfiguration implements WebMvcConfigurer {
    
    @Value("${allowed.origins}")
    private String allowedOrigins;
    @Value("${allowed.headers}")
    private String allowedHeaders;
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
       
        CorsRegistration reg = registry.addMapping("/**").allowedMethods("*");
        reg.allowedOrigins(allowedOrigins.split(","));
        reg.allowedHeaders(allowedHeaders.split(","));
        }
     
    }
    

    【讨论】:

      【解决方案2】:

      这个在Spring官方文档中不是很清楚,很容易被the official Spring Boot documentation误导。

      事实是您不能使用 application.properties 文件设置全局 CORS 配置。您必须按照Cors chapter from Spring Framework Documentation 的说明使用JavaConfig。

      只需在实现WebMvcConfigurer 并覆盖addCorsMappings 方法的@Configuration 类上使用@EnableWebMvc 注释,如下所示:

      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              registry.addMapping("/api/**")
                  .allowedOrigins("http://domain2.com")
                  .allowedMethods("PUT", "DELETE")
                  .allowedHeaders("header1", "header2", "header3")
                  .exposedHeaders("header1", "header2")
                  .allowCredentials(false).maxAge(3600);
          }
      }
      

      【讨论】:

      • 从 Spring 5 开始,而不是“扩展 WebMvcConfigurerAdapter”,使用“实现 WebMvcConfigurer”(与默认方法的接口,其中之一是 addCorsMappings(CorsRegistry 注册表))
      【解决方案3】:

      如果您想将字符串保存在 application.properties 中,您可以注入字符串

      开发

      # application-dev.properties
      appName.allowedApi=http://localhost:4200
      

      产品

      # application-prod.properties
      appName.allowedApi=https://appname.com
      

      在你的 WebConfig.java 中

      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Value("${appName.allowedApi}")
          private String myAllowedApi;
        
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              registry.addMapping("/**")
                      .allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins(myAllowedApi);
          }
      }
      

      【讨论】:

      • 这将在 dev 和 prod 中同时启用 dev 和 prod 起源。更好的解决方案是创建一个 application.properties 和一个 application-dev.properties 并在两个文件中使用相同的键名。
      • 绝对正确@Daly。这已经有一段时间了 :) 更新了答案。
      【解决方案4】:

      值得一提的是,对于较新版本的 spring,您可以使用 allowedOriginsPattrens builder 方法为允许的来源添加模式。在这种情况下,您无需严格提供来源:

      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("*");
         }
      }
      

      【讨论】:

        【解决方案5】:

        我自己得到了答案:

        只需将其添加到 application.java

          @Bean
            public WebMvcConfigurer corsConfigurer() {
                return new WebMvcConfigurer() {
                    @Override
                    public void addCorsMappings(CorsRegistry registry) {
                        registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
                    }
                };
            }
        

        【讨论】:

        • IntelliJ 显示 WebMvcConfigurerAdapter 已被贬低,可以使用 return new WebMvcConfigurer() 解决此问题
        【解决方案6】:

        使用@CrossOrigin 注释为特定控制器执行此操作的一种解决方案是:

        在控制器类中:

        @CrossOrigin(origins = "${client.url}")
        @Controller
        @RequestMapping(path = "/foo")
        public class FooController {
          ...
        }
        

        在 application.properties 中:

        # Client URL
        client.url=http://localhost:4200
        

        【讨论】:

        • 如何向 client.url 添加多个值?像client.url=http://localhost:3001,http://localhost:3002 这样的东西。我试过"#{'${client.url}'.split(',')}" 但它不起作用
        • 我会创建多个属性并分别设置每个属性,例如:@CrossOrigin(origins = {"${client.url.dev}", "${client.url.test}" }) 我做了一个小测试,它似乎工作正常
        • 我正在积极地将此解决方案与 Spring Boot 2.0.5 一起使用。在我看来,它非常实用和整洁。只是诚实和友好,我想知道我是否做错了得到反对票。
        【解决方案7】:

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

        上述(null)并不意味着“Access-Control-Allow-Origin”将不存在。它可以通过我们注入之外的过滤器添加(例如,如果您有使用@CrossOrigin 注释的控制器 - 跨域标头将添加到我们的 CorsFilter 之外的其他一些 mvc 过滤器中)。

        在下面的例子中,我们点击了 /actuator:

        您还可以创建自己的自定义过滤器,将标头添加到 http-response。我认为使用标准方法更好,但在某些调试情况下,通过在文件过滤器中添加一行可能会很方便 - 您可以添加所需的。

        response.addHeader("Access-Control-Allow-Origin", "*");
        

        请注意,上述内容不包含之前提供的条件检查。

        希望这会有所帮助。干杯

        【讨论】:

          【解决方案8】:

          在 spring boot2 中更简单,只需像这样在管理执行器中指定跨域 url

          management.endpoints.web.cors.allowed-origins=http://examaple.com ,http://examaple1.com 
          management.endpoints.web.cors.allowed-methods=GET, POST
          

          【讨论】:

          • 这仅适用于执行器端点,不适用于您的应用程序自己的端点。
          【解决方案9】:

          无论如何,我们都可以将实际的 cors 相关 url 移动到 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
          

          【讨论】:

            【解决方案10】:

            endpoints.cors.* 为前缀的 Spring boot 属性被 Actuator 使用,因此它不能与 MVC 端点一起使用。

            【讨论】:

              猜你喜欢
              • 2020-01-09
              • 1970-01-01
              • 2017-08-07
              • 2021-04-03
              • 1970-01-01
              • 2016-06-26
              • 1970-01-01
              • 2019-01-14
              相关资源
              最近更新 更多