服务器禁用cors后为什么会出现cors错误?

问题描述 投票:0回答:1

我在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 主机上则不行。 您有想法如何解决吗? :/

javascript java spring cors
1个回答
0
投票

由于 CORS(跨源资源共享)配置为允许所有源 (*),并且应用程序在本地计算机上运行良好,但在 Docker 主机上运行不佳,因此导致此问题的原因可能有多种。您可以采取以下一些步骤来排除故障并解决问题:

  1. 检查 Docker 网络设置:确保两个容器位于同一 Docker 网络上,以实现无缝通信。

  2. 验证环境变量:仔细检查环境变量 REACT_APP_SERVER_URL 和 SERVER_ADDRESS 以确保它们正确配置为指向后端服务器。确保没有拼写错误或缺少字符。或者,尝试在配置文件中设置代理

  3. 检查 CORS 预检请求:使用浏览器开发人员工具检查 CORS 预检请求和响应,以识别任何不匹配或错误。

  4. 检查防火墙规则:确保没有防火墙规则阻止 Docker 网络内部和外部的 Docker 容器之间的通信。

  5. 修改 CORS 配置:临时调整 CORS 配置以明确允许所有源 (

    *
    ) 查看问题是否与 CORS 限制有关。

  6. 检查容器日志:检查 Docker 容器日志中是否有任何与 CORS 相关的错误或可能影响通信的网络连接问题。

  7. 验证 Docker 主机网络配置:确保 Docker 主机网络设置允许容器之间通信所需端口上的入站和出站流量。

  8. 使用容器名称:在 Docker Compose 配置中使用容器名称而不是 IP 地址,以确保无缝通信,无论 IP 更改或网络配置如何。

通过遵循这些步骤并考虑每个操作背后的原因,您可以系统地诊断和解决 Docker 容器之间的 CORS 问题。

© www.soinside.com 2019 - 2024. All rights reserved.