当前位置: 首页 > 知识库问答 >
问题:

做出反应。客户端阻止了从端口3000到Spring Boot 8080的JS请求

那铭
2023-03-14

我在 Spring Boot 中有一个后端应用程序在端口 8080 上运行,前端 React.js 项目在端口 3000 上运行。我们正在从 React.js(端口 3000)向 Spring Boot /authenticate endpoint(端口 8080)发送请求,在那里它验证登录信息并发回响应。在我自己的计算机上运行这两个应用程序时,这非常有效。但是,我们需要使用 vm 并在单独的 docker 容器中运行应用程序。当前端位于容器中时,只有主机可以访问端口 3000。这是我们用于前端的 Dockerfile:

FROM node:alpine
RUN mkdir /app
WORKDIR /app
COPY package.json /app
COPY package-lock.json /app
RUN npm install
RUN npm install cors
COPY . /app
CMD ["npm", "start"]

这是我们使用的docker run命令:

docker run -it -p 3000:3000 --name frontend-react group09/frontend-react

为了允许主机以外的其他用户到达端口3000,我们使用ngin x代理将流量从端口80路由到3000。然而,当我们这样做时,我们在控制台中收到了一条ERR: BLOCKED BY CLIENT消息。我还将附加我们在Spring Boot中使用的SecurityConfig:

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Allow JWT authentication
        http.cors().and().csrf().disable()
                .authorizeRequests()
                .antMatchers("/authenticate").permitAll()
                .anyRequest().authenticated()
                .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        // Enable our JWT authentication filter
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);

        // Necessary authorization for each endpoint will be configured by each method, using @PreAuthorize
    }

Cors 配置:

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000","http://localhost:3000/","http://localhost:3000/login"));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"));
    configuration.setAllowedHeaders(Arrays.asList("authorization", "withCredentials","content-type", "x-auth-token","Access-Control-Allow-Credentials","access-control-allow-origin","Access-Control-Allow-headers"));
    configuration.setExposedHeaders(Arrays.asList("x-auth-token","set-cookie"));
    configuration.setMaxAge(Duration.ofSeconds(5000));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

我真的很感激任何关于如何解决这个问题的建议。我们非常确定问题不在代码中,因为在docker容器之外运行时,它完全可以运行。

共有2个答案

微生啸
2023-03-14

我花了整整20个小时才解决了这个问题。基本上,我们必须将AllowedOrigins设置为*,以便允许所有IP。为此,您还必须将AllowCredentials设置为false。

壤驷鸿
2023-03-14

您是否检查了请求中的< code>referrer字段?在这种情况下,很可能不是localhost,而是您的域名。

在这种情况下,您需要将 frontend_domain_name:3000 添加到 cors 策略允许的源字段中。

更新:实际上,建议将允许的来源设置为*的答案禁用了CORS,因为它允许所有域访问您的后端代码,而不仅仅是您的前端部分。正确的方法是添加your_frontend_domain_name: 3000作为允许的来源。这样,您的后端只能由通过您的前端网站工作的用户访问。

 类似资料:
  • 我正在做一个正在改造/现代化的项目,其中有一个小的RMI部分,不幸的是,我以前从未与RMI合作过。 我不明白的一件事是,为什么在我最初创建RMI客户端之后,它一直调用其自定义SocketFactory构造函数。似乎每5分钟我就会看到一次调用构造函数的输出,即使客户端和服务器之间没有通信。 连接完成后,我应该做什么来清理和停止任何线程以进行持久化? 我在检查UnicastRemoteObject,也

  • 我试图使用Spring反应式WebClient将文件上传到Spring控制器。控制器非常简单,看起来像这样: 当我使用这个控制器与cURL一切正常 multipartFile转到正确的参数,其他参数进入Map。 当我尝试从WebClient做同样的事情时,我被卡住了。我的代码如下所示: 这会导致400错误 有人知道如何解决这个问题吗?

  • 我已经为一个服务实现了socket.io,然后删除了它。但是,我仍然有客户机向endpoint/socket.io发出初始连接请求,而endpoint/socket.io已经不存在了。使用各种http状态代码进行响应似乎并不重要。 是否有方法阻止客户端尝试连接?我每分钟收到几千个请求。

  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • 问题内容: 我正在使用,当我单击搜索字段PlaceAutocompleteFragment对话框消失时,出现此错误: {“错误”:[{“域”:“全局”,“原因”:“禁止”,“消息”:“此Android客户端应用程序com.ganger.package的请求被阻止。”}],“代码”: 403} 顺便说一句,当我通过Android Studio安装该应用程序时,它可以完美运行,所以…我为解决此问题所做