CORS 和 Spring MVC 服务 - 如何设置跨域主机?

Posted

技术标签:

【中文标题】CORS 和 Spring MVC 服务 - 如何设置跨域主机?【英文标题】:CORS and Spring MVC Services - How to setup cross origins hosts? 【发布时间】:2018-07-23 16:42:49 【问题描述】:

前言

考虑一下我在本地运行的这两个 webapp:

前端Webapp localhost:8080 服务Webapplocalhost:2020

在我的本地开发环境(工作)

当我访问我的前端 Web 应用程序时,我在后台执行了 javascript。此 JavaScript 正在向我的 Service Webapp 发出 XHR 请求。这些调用被 SOP(同源策略)阻止。因为我的前端 Web 应用程序尝试调用另一个源(在本例中为端口 2020)上的服务。

为了使用 CORS(跨源资源共享),我允许我的前端 Web 应用使用 Spring 的 @CrossOrigin (Documentation) 注释访问我的服务 Web 应用的资源。

  @CrossOrigin(Resources.Origins.FRONTEND) // http://localhost:8080
  @GetMapping(Resources.Services.APIs.History.STREAM)
  public SseEmitter subscribeToHistoryEvent() 
    // logic
  

设置完成后,我成功地将 XHR 请求从我的前端 Web 应用程序发送到我的服务 Web 应用程序。

在我的虚拟机部署环境中(不工作)

然后我尝试将我的应用程序部署到我的虚拟机上,以便从远程角度进行测试。

现在可以通过这些 URL 访问网络应用程序

我的机器IP192.50.3.100 前端Webapp 192.20.1.77:8080 服务Webapp192.20.1.77:2020

我能够访问我的前端 Web 应用程序由于SOP,无法再次向我的服务 Web 应用程序触发 XHR 请求。

我认为这是因为我现在正在从我的机器 192.50.3.100 向 Service Webapp 发出 XHR 请求,而实际上只允许 http://localhost:8080 访问其资源。

我的结论

我认为我误解了这里应该使用 CORS 的方式。我不应该通过 JavaScript 触发 XHR 请求,因此从我的 BrowserClient 到任何跨源服务,但我宁愿调用我的前端 Web 应用程序并让它执行请求 到另一个居住在另一个来源的另一个服务?

请告诉我使用 CORS 跳过 SOP 的正确方法是什么!

【问题讨论】:

【参考方案1】:

当您尝试从前端访问http://localhost:8080 时,它会访问执行 JS 的机器的 localhost(实际上是浏览器启动的地方)。

JS 应该调用后端的真实 IP - 192.20.1.77:2020 而不是 localhost:2020。

【讨论】:

但是就部署位置而言,这不是灵活的吗?如果我在另一个环境中重新部署怎么办?然后我不得不一直重写 javascript XHR 请求端点或拥有某种动态配置属性。确定这是这里唯一的解决方案吗? 必须配置后端IP(或URL)。并且绝对不应该是产品的本地主机。 localhost 指向本地机器。您可以添加例如指定后端主机的前端应用程序上的属性文件。例如。在 Angular 中,您可以在 main.bundle.js 中定义类似 var environment = production: true, domain: '192.20.1.77:2020', ; 使用window.location.host有什么问题吗?因为这会产生完全正确的网址 我猜应该没问题。区别只是端口,因此该方法应该有效。如果您的后端主机和前端主机不同,则会失败。

以上是关于CORS 和 Spring MVC 服务 - 如何设置跨域主机?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring MVC 为所有 API 启用 CORS

Spring MVC学习(11)—跨域的介绍以及使用CORS解决跨域问题

无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头

Spring MVC 4.2+ CORS 返回 403

使用 Java Config 的全局 CORS 配置在 Spring MVC 中不起作用

spring MVC cors跨域实现源码解析 CorsConfiguration UrlBasedCorsConfigurationSource