我在spring中有一个后端应用程序,其中cors配置如下:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception {
MvcRequestMatcher.Builder mvc = new MvcRequestMatcher.Builder(introspector);
return http
.cors(cors -> cors.configurationSource(corsConfiguration()))
.csrf(AbstractHttpConfigurer::disable)
.headers(configurer -> configurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable))
.sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(request -> request
.requestMatchers(mvc.pattern("/admin/**")).hasAuthority("ADMIN")
.requestMatchers(mvc.pattern("/cart/**"), mvc.pattern("/user/**"),
mvc.pattern("/order/**"), mvc.pattern("/orders/**"),
mvc.pattern("/order-product/**"), mvc.pattern("/favorite-product/**"))
.authenticated()
.anyRequest().permitAll())
.build();
}
@Bean
UrlBasedCorsConfigurationSource corsConfiguration() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedOriginPatterns(List.of("*"));
corsConfiguration.setAllowedHeaders(List.of("*"));
corsConfiguration.setAllowedMethods(List.of("*"));
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return urlBasedCorsConfigurationSource;
}
后端和前端应用程序在docker中运行如下:
shoponlineback:
image: shoponlineback:latest
container_name: shoponlineback
ports:
- "8080:8080"
networks:
- shoponlinenetwork
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldatabase:3306/shoponline?useUnicode=true&characterEncoding=UTF-8
SERVER_ADDRESS: 0.0.0.0
SERVER_PORT: 8080
depends_on:
mysqldatabase:
condition: service_healthy
shoponlinefront:
image: shoponlinefront
container_name: shoponlinefront
networks:
- shoponlinenetwork
ports:
- "80:3000"
environment:
REACT_APP_SERVER_URL: http://146.59.93.226:8080
WDS_SOCKET_PORT: 0
depends_on:
- "shoponlineback"
volumes:
mysql-data:
networks:
shoponlinenetwork:
driver: bridge
主机IP地址是146.59.93.226。 这很奇怪,因为 cors 允许所有来源。在我的本地计算机上一切正常,但在 docker 主机上则不行。 您有想法如何解决吗? :/
这很奇怪,因为 cors 允许所有来源。在我的本地计算机上一切正常,但在 docker 主机上则不行。 您有想法如何解决吗? :/
由于 CORS(跨源资源共享)配置为允许所有源 (*),并且应用程序在本地计算机上运行良好,但在 Docker 主机上运行不佳,因此导致此问题的原因可能有多种。您可以采取以下一些步骤来排除故障并解决问题:
检查 Docker 网络设置:确保两个容器位于同一 Docker 网络上,以实现无缝通信。
验证环境变量:仔细检查环境变量 REACT_APP_SERVER_URL 和 SERVER_ADDRESS 以确保它们正确配置为指向后端服务器。确保没有拼写错误或缺少字符。或者,尝试在配置文件中设置代理
检查 CORS 预检请求:使用浏览器开发人员工具检查 CORS 预检请求和响应,以识别任何不匹配或错误。
检查防火墙规则:确保没有防火墙规则阻止 Docker 网络内部和外部的 Docker 容器之间的通信。
修改 CORS 配置:临时调整 CORS 配置以明确允许所有源 (
*
) 查看问题是否与 CORS 限制有关。
检查容器日志:检查 Docker 容器日志中是否有任何与 CORS 相关的错误或可能影响通信的网络连接问题。
验证 Docker 主机网络配置:确保 Docker 主机网络设置允许容器之间通信所需端口上的入站和出站流量。
使用容器名称:在 Docker Compose 配置中使用容器名称而不是 IP 地址,以确保无缝通信,无论 IP 更改或网络配置如何。
通过遵循这些步骤并考虑每个操作背后的原因,您可以系统地诊断和解决 Docker 容器之间的 CORS 问题。