从 Angular4 调用 Spring Rest 服务时的 CORS(跨源问题)

Posted

技术标签:

【中文标题】从 Angular4 调用 Spring Rest 服务时的 CORS(跨源问题)【英文标题】:CORS (Cross origin issue) while invoking Spring Rest services from Angular4 【发布时间】:2019-06-17 18:31:01 【问题描述】:

我们有一个使用 Angular2 开发的前端应用程序,服务(REST 服务)是使用 Spring MVC 开发的。当前端应用程序(即 javascript)调用服务时,我们面临跨源问题,服务调用不成功。

在研究中,可以选择在服务端包含 CORSFilter,但 UI 调用了大约 30 个服务,它们都是单独的可部署的。

在 30 个服务中进行更改不是一个可行的选择,除了在服务端进行更改之外,还有其他选择吗?

请提出建议。

【问题讨论】:

您假设将跨源添加到您的端点(服务器端)。您需要允许发送请求的服务器才能访问服务器端。不知道它在 JAVA 上是如何工作的,但只是在互联网上寻找它。 “向弹簧添加交叉原点” 示例代码:github.com/dineshbhagat/spring-boot-cors-example 【参考方案1】:

我认为除了在服务器端启用 CORS 之外别无他法。也许您可以封装您的 API 端点,制作一个专用的微服务并在其上启用 CORS。

【讨论】:

【参考方案2】:

spring boot 中有一个解决方案,您可以在此链接中找到它:https://spring.io/guides/gs/rest-service-cors/ 我不是特别确定您需要什么,但 @crossOrigin(-->Link of your site


编辑

这是此链接中的全局配置:https://spring.io/guides/gs/rest-service-cors/#_global_cors_configuration 在我的应用上添加此内容后,它解决了我的问题。

【讨论】:

【参考方案3】:

我认为,这里的内容远不止眼前所见,重要的是首先了解 CORS,然后尝试找出解决方案,因为人们在 CORS 讨论中引入了诸如 - Angular 等字眼。

假设您已经开发和部署了 API,打算从部署在某些固定 URL/域的特定 UI 代码中使用。作为服务器,CORS 是一种告诉客户端(如浏览器)的方式,即使我正在处理此请求,但我也告诉您此请求并非来自我作为服务器预期的 UI 域(by默认 - 它必须是相同的来源 )所以你采取必要的行动。当浏览器被服务器标记时,它会抑制服务器响应并显示请求失败。

以上确实是一个非常简单的描述,您应该了解更多关于同源安全政策。

另外,请注意,服务器通过设置有关它支持的来源的响应标头来标记客户端,但无论如何都会提供响应,因此到目前为止您应该了解两点,

    与Angular无关,与浏览器有关 它是客户端的特权,如果服务器告诉它请求不是来自 origin / domain ,它是期待的。通常只有网络浏览器实现它,而不是由 curl 等客户端完成

说了这么多,您是否希望您的 API 托管在与 UI 域相同的域中? 如果不是,那么您需要更改服务器端代码以明确告知 CORS 标头,否则浏览器将继续失败。

解决方案,

1.为每个端点添加注释-org.springframework.web.bind.annotation.CrossOrigin

2.向每个可部署单元添加全局配置,如图所示here。优点是这些工件可以进一步部署到不同的域。

不要只是盲目地复制 - 粘贴此行 config.addAllowedOrigin("*"); ,将其设置为您希望服务的特定域,否则没有这种安全性。

3. 编写另一个可部署的工件来处理您的安全信息,例如 CORS 等,这个工件将是接收所有传入请求并在构建来自这 30 个端点的响应后响应的前端。客户端不会直接与这 30 个端点交互,而只会与这个工件交互。显然,在与这 30 个端点相同的域上也需要此工件。

对 30 项服务进行更改不是一个可行的选择,除了 在服务方面进行更改,还有其他选择吗 可用吗?

我认为除了在服务器端更改代码之外没有其他解决方案。您团队之外的任何人都无法对您提出这些要求,因为部署模型是非常恰当的主题,并且会根据需要从组织到组织进行。

Origin 标头在请求中发送,由三部分组成:协议、主机和端口号。

【讨论】:

感谢 Sabir Khan 的详细解释。让我尝试实施建议的更改。

以上是关于从 Angular4 调用 Spring Rest 服务时的 CORS(跨源问题)的主要内容,如果未能解决你的问题,请参考以下文章

在spring boot应用程序中从自己的rest api调用另一个rest api

Spring Data JPA - 使用 REST 调用上的查询参数从方法名称生成查询

从 Android 调用使​​用 Spring Security 保护的 REST Web 服务

从 Ajax 调用 Spring Boot Rest API 时出现 CORS 错误

如何在Spring启动应用程序中进行REST调用而不在Spring安全性中禁用CSRF保护?

Angular 4 POST 到 WCF REST 服务返回 NULL 响应