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:
前端Webapplocalhost: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学习(11)—跨域的介绍以及使用CORS解决跨域问题
无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头
使用 Java Config 的全局 CORS 配置在 Spring MVC 中不起作用
spring MVC cors跨域实现源码解析 CorsConfiguration UrlBasedCorsConfigurationSource