我的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。
3条答案
按热度按时间olhwl3o21#
我相信拥有
注册两次。删除
configurationSource
或@Bean
js4nwp542#
我认为你需要修改.htaccess文件。你需要写下面的代码。
这里有时会导致由于服务器问题。
xsuvu9jc3#
我通过从连接到spring网关的上游应用程序中删除CORS配置解决了类似的问题