【问题标题】:Enabling CORS globally in Spring Boot在 Spring Boot 中全局启用 CORS
【发布时间】:2019-01-14 04:13:43
【问题描述】:

我尝试像这样全局启用 CORS:

@Configuration
@ComponentScan("com.example")
@EnableWebMvc
public class OriginFilter extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}

我也试过这种方法:

@Configuration
public class OriginFilter implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                .allowCredentials(true);
    }
}

但这些都不适合我。

单个类的注释 @CrossOrigin 有效,但我想在全局范围内启用 CORS。

【问题讨论】:

  • 您可以使用 this thread 中描述的 CorsConfigurationSource。

标签: java spring-boot cors


【解决方案1】:

我通过添加 filterClass 解决了这个问题

@Component
public class CORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept");
        response.setHeader("Access-Control-Expose-Headers", "Location");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

【讨论】:

  • 感谢您将其发布为答案!
【解决方案2】:

您确实可以定义自己的Filter,正如您在回答中提到的那样。 Spring 已经有了这样的CorsFilter,所以你不必自己创建一个。只需将其注册为 bean,它应该可以工作:

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // Don't do this in production, use a proper list  of allowed origins
    config.setAllowedOrigins(Collections.singletonList("*"));
    config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept"));
    config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

【讨论】:

  • 谢谢我测试了它并且它正在工作。这是更好的方法,你是对的。
  • 但是你究竟会把上面的代码放在哪里呢?我们需要用上面的方法新建一个过滤器吗?
  • @henry 这不仅仅是一个方法,这个方法返回一个过滤器(CorsFilter 实现了Filter)。此方法应放置在配置类中(具有@Configuration 注释的类或主类)。
  • 这被记录在here
【解决方案3】:

为我使用WebMvcConfigurer 而不使用过滤器的工作全局 CORS 配置。

@Configuration
public class GlobalCorsConfiguration {

    public GlobalCorsConfiguration() {
        super();
    }

    /**
     * Bean to define global CORS.
     * 
     * @return
     */
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH");
            }
        };
    }
}

谢谢。

【讨论】:

    【解决方案4】:

    您还可以执行以下操作以在 Spring Boot 应用程序中全局启用 CORS。 但是请注意,WebMvcConfigurerAdapter 已被弃用。

    @SuppressWarnings("deprecation")
    @SpringBootApplication(exclude = org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class)
    public class SpringbootMongodbDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootMongodbDemoApplication.class, args);
        }
        @Bean
            public WebMvcConfigurer corsConfigurer() {
                return new WebMvcConfigurerAdapter() {
                    @Override
                    public void addCorsMappings(CorsRegistry registry) {
                        registry.addMapping("/**").allowedOrigins("*");
                    }
                };
            }
    
    

    同样在Controller中添加以下内容——

    @PostMapping("/addfeedback")
    @CrossOrigin(origins = "*")
    public FeedbackForResolution addFeedback(@RequestBody FeedbackForResolution feedback) {
    .
    .
    .
    }
    

    【讨论】:

      【解决方案5】:

      我也遇到过这个问题,并尝试使用此页面上列出的一些解决方案,但收效甚微。我正在使用 Spring Boot 版本 2.1.2.RELEASE。

      这为我解决了,

      import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
      import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
      blah
      blah
      
      
          @Bean
          public CorsFilter corsFilter() {
              UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
              CorsConfiguration config = new CorsConfiguration();
              config.setAllowCredentials(true); 
              config.addAllowedOrigin("http://localhost:4200");
              config.addAllowedHeader("*");
              config.addAllowedMethod("GET");
              config.addAllowedMethod("PUT");
              source.registerCorsConfiguration("/**", config);
              return new CorsFilter(source);
          }
      

      blah blah 是我的其余代码。

      我不知道为什么这个方法对我有用而其他方法没有,它允许我的打字稿应用程序从 localhost:4200 连接到我在 localhost:8080 上运行的 Spring Boot 应用程序

      【讨论】:

        【解决方案6】:

        这是您的方法的解决方案。这按预期工作正常。可能为时已晚。但它会对某人有用。

        有两种方式可以全局启用。

        1.一个是通过创建bean。 2.另一个是完整的注释

        第一种方法:

        @Configuration
        public class CorsConfiguration {
            @Bean
            public WebMvcConfigurer corsConfigurer() {
                return new WebMvcConfigurer() {
                    @Override
                    public void addCorsMappings(CorsRegistry registry) {
                        registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedOrigins("*")
                        .allowedHeaders("*");
                    }
                };
            }
        }
        

        第二种方法:

        通过在控制器类的顶部添加 @CrossOrigin 注释。

        但前两种方法不适用于我的 PUT 请求。对于Put Method,您可以使用以下方法。

        以下方法适用于所有类型的请求。

        @Configuration
        public class CorsConfig {
        
            @Bean
            public CorsFilter corsFilter() {
                UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
                CorsConfiguration config = new CorsConfiguration();
                config.setAllowCredentials(true);
                config.addAllowedOrigin("*");
                config.addAllowedHeader("*");
                config.addAllowedMethod("OPTIONS");
                config.addAllowedMethod("GET");
                config.addAllowedMethod("POST");
                config.addAllowedMethod("PUT");
                config.addAllowedMethod("DELETE");
                source.registerCorsConfiguration("/**", config);
                return new CorsFilter(source);
            }
        
        }
        

        【讨论】:

        • 这看起来不对。你怎么能有implements WebMvcConfigurer却没有实现addCorsMappings()方法?
        • 请正确检查代码。我已经在第一种方法中实现了 addCorsMappings。
        【解决方案7】:

        您好,我最近遇到了这个问题(全局配置不起作用)!我发现了一些有用的东西。

        我们应该像这样在末尾添加反斜杠http://localhost:4200/ 基本上应该是http://localhost:4200(结尾不是反斜杠)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-10
          • 2019-10-10
          • 2020-05-29
          • 2016-12-04
          • 2020-09-13
          • 2017-08-10
          • 2021-04-03
          • 2018-11-08
          相关资源
          最近更新 更多