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

时间:2019-01-24 04:54:17

标签: angular spring-rest

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

在研究中,可以选择在服务端包含CORSFilter,但是UI会调用约30个服务,并且所有这些服务都是可单独部署的。

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

请提出建议。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

spring boot中有一个解决方案,您可以在以下链接中找到它:https://spring.io/guides/gs/rest-service-cors/我不确定您需要什么,但是@crossOrigin(->您网站的链接<-)在我的网站上有效结束。


编辑

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

答案 2 :(得分:0)

我认为,这里的内容不仅仅吸引眼球,而且它的重要性是首先了解CORS,然后尝试找出解决方案,因为人们在CORS讨论中引入了 Angular 等字眼。

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

以上确实是一个非常简单的描述,您应该了解有关相同来源安全性策略的更多信息。

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

  1. 它与Angular无关,与浏览器无关
  2. 如果服务器告诉它请求不是来自期望的来源/域,这是客户端的特权。通常,只有网络浏览器才能实现此功能,而 curl
  3. 之类的客户端无法实现

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

解决方案

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

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

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

3。编写另一个可部署的工件,处理诸如CORS等安全性内容,该工件将成为接收所有传入请求并在从这30个端点构造响应之后进行响应的前端。客户不会直接与这30个端点交互,而只会与该工件交互。显然,在与这30个端点相同的域上也将需要此工件。

  

除了30种服务之外,进行更改不是一个可行的选择   在服务方面进行更改,是否还有其他选择   有空吗?

除了在服务器端更改代码外,我认为没有其他解决方案。团队外部的任何人都不能在您身上决定这些,因为部署模型是非常适当的主题,并且在组织之间按需依据。

来源标头是在请求中发送的,它由三部分组成:协议,主机和端口号。