在 Docker 中部署 Spring Boot 和 Angular 应用程序时出现 CORS 错误

Posted

技术标签:

【中文标题】在 Docker 中部署 Spring Boot 和 Angular 应用程序时出现 CORS 错误【英文标题】:CORS errors when deploying Spring Boot and Angular app in Docker 【发布时间】:2020-03-03 18:05:16 【问题描述】:

我已经部署了 3 个 docker 容器——用于数据库、后端(Spring boot)和前端(Angular)。但是,当我访问该网站(Google Cloud VM)时,我收到所有对后端请求的 CORS 错误。后端运行在 8080 上。

当我访问 IP:80 时,我得到了 CORS

为什么会这样?解决方法是什么?

这是我在控制器中使用 CrossOrigin 的方式。

@CrossOrigin("*")
@RestController
@RequestMapping("/api")
public class CustomerController 

感谢任何帮助。

【问题讨论】:

能否提一下错误日志? @awesomemypro 我遇到了同样的错误,能否请您分享解决方案的详细信息? 【参考方案1】:

您不能从您的脚本中调用在您的页面呈现的同一域下找不到的 URL:

出于安全原因,浏览器会限制从脚本发起的跨域 HTTP 请求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。这意味着使用这些 API 的 Web 应用程序只能从加载应用程序的同一来源请求资源,除非来自其他来源的响应包含正确的 CORS 标头。

来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

您实际上有 3 个选项:

    将 8080 端口(Spring Boots Tomcat 服务器的端口)添加到您的异常中(请参阅:https://spring.io/guides/gs/rest-service-cors/) 使用像 nginx 这样的反向代理,将您的请求路由到 API 或根据请求提供 Angular 资源 从您的 Spring Boot 应用程序中提供 Angualr 资源

【讨论】:

808?我的 Angular 应用程序在 4200 上运行,但我通过 80 访问它(如 docker-compose.yml 中所述)。后端运行在 8080 上。【参考方案2】:

@Cross : 将应用于单页它不适用于整个应用程序所以我建议您遵循下面类似场景链接中定义的方法:CORS Config。您可以在其中为整个应用程序定义过滤器,并更好地控制 CORS 的配置。

此外,如果您的应用程序集成了 Spring 安全性,您需要处理更多配置更改才能使其正常工作。

希望对你有帮助

【讨论】:

以上是关于在 Docker 中部署 Spring Boot 和 Angular 应用程序时出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 容器中重新部署 spring-boot 应用程序?

(转)Spring Boot 2 :使用 Docker 部署 Spring Boot

docker 部署Spring Boot:Docker化Spring Boot应用程序

spring-boot项目的docker集成化部署

spring boot 项目部署在Docker中调用redis出现的奇怪问题

spring boot项目生成docker镜像并完成容器部署