使用Java Config的全局CORS配置不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java Config的全局CORS配置不起作用相关的知识,希望对你有一定的参考价值。

我正在努力使用Java配置来运行Global CORS配置。我不确定这是否是一个已知问题,因为其他人也有同样的问题:Spring Global CORS configuration not working but Controller level config does

无论如何,让我进一步阐述我想要做的事情:

我正在使用Spring 4.2.3.RELEASE(没有弹簧启动)。我正在尝试使用Java配置配置全局CORS配置,以便我可以使用属性文件中的@Value注入CORS域(allowed-Origin)。因为据我所知,我不能在mvc xml名称空间中为allowed-origin注入值,如下图所示(如果你知道任何其他解决这个问题的方法,请告诉我):

<mvc:cors>
        <mvc:mapping path="/**" allowed-origins="${vrm.cors.domain}"
                     allowed-methods="*"
                     allowed-headers="*"
                     allow-credentials="false" max-age="3600"/>
</mvc:cors>

从Spring参考文档here,我试图使用java配置来配置Global CORS来解决问题。但是,我无法让CORS工作。代码在应用程序启动期间调用,但客户端的调用始终返回

请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,'http://localhost:3000'原产地不允许进入

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Value("${vrm.cors.domain}")
    //vrm.cors.domain=/**
    private String corsDomain;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").
        .allowedOrigins(vrm.cors.domain);
    }
}
答案

根据这个答案https://stackoverflow.com/a/33823253

你可以像这样启用cors:

@EnableWebSecurity
@Configuration
class SecurityConfig extends WebSecurityConfigurerAdapter {

  private final AppProperties appProperties;

  @Autowired
  public SecurityConfig(AppProperties appProperties) {
    this.appProperties = appProperties;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(corsFilter(), SessionManagementFilter.class) //adds your custom CorsFilter
        .authorizeRequests()
        .antMatchers("/**")
        .permitAll()
        .and()
        .csrf()
        .disable();
  }

  private CorsFilter corsFilter() {
    return new CorsFilterAdapter(
        appProperties.getClientUrls(),
        appProperties.getHeaders(),
        appProperties.getMethods())
        .corsFilter();
  }
}

CrosFilterAdapter是这样的:

public class CorsFilterAdapter {

  private final String[] clientUrls;
  private final String[] headers;
  private final String[] methods;

  public CorsFilterAdapter(String clientUrls, String headers, String methods) {
    this.clientUrls = clientUrls.split(",");
    this.headers = headers.split(",");
    this.methods = methods.split(",");
  }

  public CorsFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(false);
    for (String clientUrl : clientUrls) {
      config.addAllowedOrigin(clientUrl);
    }
    for (String header: headers) {
      config.addAllowedHeader(header);
    }
    for (String method : methods) {
      config.addAllowedMethod(method);
    }
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
  }
}

以上是关于使用Java Config的全局CORS配置不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java Config 的全局 CORS 配置在 Spring MVC 中不起作用

Sails.js 全局 CORS 配置不起作用,每条路线是

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

Spring 4/5 全局 CORS 配置不起作用,给出“请求的资源上不存在‘Access-Control-Allow-Origin’标头’

Spring Boot Cors 问题:尝试了所有方法,但 POST 不起作用

Spring Boot全局支持CORS(跨源请求)