Spring Boot 如何修复Sping Boot 中Access-Control-Allow-Origin的多个值

gkn4icbw  于 2023-01-05  发布在  Spring
关注(0)|答案(3)|浏览(163)

我的Spring Cloud Gateway版本2.6.8具有此配置

@EnableWebFluxSecurity
@Configuration
public class GatewayWebSecurity {
  private static final Logger LOGGER = LoggerFactory.getLogger(GatewayWebSecurity.class);

  @Value("${allowed.client.host}")
  private String allowedClientHost; //--->this is http://localhost:4200

  @Bean
  public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.cors().configurationSource(corsConfigurationSource()).and().csrf().disable();
    return http.build();
  }

  @Bean
  public CorsConfigurationSource corsConfigurationSource() {
    final CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Collections.singletonList(allowedClientHost));  //--->this is http://localhost:4200
    configuration.setAllowedMethods(List.of("GET", "PUT", "DELETE", "POST", "OPTIONS"));
    configuration.setAllowedHeaders(Collections.singletonList("*"));
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
  }
}

假设我的allowedClientHost被配置为http://localhost:4200/,当我发出请求时,我在Chrome中收到了这个错误消息。
...来自源"http://localhost:4200"的已被CORS策略阻止:Access-Control-Allow-Origin "标头包含多个值" http://localhost:4200、http://localhost:4200 ",但只允许一个值
我没有任何其他CORS配置。当我用"*"替换此类主机时,例如,

configuration.setAllowedOrigins(Collections.singletonList("*"));

错误消息更改为
Access-Control-Allow-Origin "标头包含多个值"",但只允许一个
我用调试器跟踪了这段代码,它只在这个方法上运行了1xTime。我不能解释为什么值在那里出现了两次。我也在chrome devtools中重复检查了这一点。

我做错了什么?

更新

经过几个小时的调试,我找到了问题的原因。这是一个新的bug引入了Spring Boot 2.6.8和Spring Cloud v2021.0.3。恢复依赖更新提交到2.6.6与2021.0.1立即解决了这个问题。我将尝试创建一个最小的可复制代码,并打开一个新的问题gitgub。

olhwl3o2

olhwl3o21#

我相信拥有

http.cors().configurationSource(corsConfigurationSource())

//and

@Bean
public CorsConfigurationSource corsConfigurationSource()

注册两次。删除configurationSource@Bean

js4nwp54

js4nwp542#

我认为你需要修改.htaccess文件。你需要写下面的代码。

<IfModule mod_negotiation.c>
    Options -MultiViews -Indexes
</IfModule>

这里有时会导致由于服务器问题。

xsuvu9jc

xsuvu9jc3#

我通过从连接到spring网关的上游应用程序中删除CORS配置解决了类似的问题

相关问题