已解决-从Java Spring写入Angular 9套接字-被CORS策略阻止

问题描述 投票:0回答:1

我在尝试在Angular 9应用程序中打开SockJS套接字并使用SimpMessageTemplate从Spring后端写入此套接字时遇到问题。此任务的主要目标是实时接收和显示传入的数据而无需轮询。

我基于repository完成的现有mouadelfakir的原始实现,但是该实现使用了较旧版本的软件(Angular〜1和Spring Boot〜1.5)。当更新到较新版本时,Angular 9更新没有提供应用程序工作方式的任何变化,但升级到Spring Boot 2.2.6会破坏实现。

在尝试连接到后端Spring应用程序的Angular应用程序上,控制台输出以下两个错误:

- Access to XMLHttpRequest at 'http://localhost:8080/websocket-backend/socket/info?t=1589733936852' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
- GET http://localhost:8080/websocket-backend/socket/info?t=1589733936852 net::ERR_FAILED
[春季政策,但无济于事。这些帖子大多数都比较老,我认为由于软件更新,它们可能不再有效。

这是我使用的示例存储库的current fork,其中包含要使用的软件升级。

编辑:感谢您对此的反馈,我能够解决此问题。这是由于升级到较新版本的Spring而引起的,但实际上是由于弃用了application.properties中原始开发使用的密钥,而该密钥一直困扰着我。如果有人需要,我的current fork上存在更新的代码。

java angular spring spring-boot sockjs
1个回答
0
投票
您使用的示例已经2岁了。即使是现在,并不是所有的浏览器都具有内置的CORS支持,因此存在问题。

因此您的应用程序实际上从未连接到套接字。您的浏览器首先向后端发送请求套接字信息的请求,但该请求失败,因为您的后端未指定CORS标头。或更具体地说,请求成功,但是浏览器拒绝处理响应(即使有一些合法的JS代码来处理响应),因为CORS标头与您的应用程序表示的数据不匹配。

高层,您可能希望后端返回以下标头

  • Access-Control-Allow-Origin-您的用户界面所在的DNS(例如http://localhost:8080)或*。此标头只能有1个值。这不是列表。
  • Access-Control-Allow-Methods-允许浏览器执行的HTTP方法的逗号分隔列表,因此GET, POST, PUT, DELETE, OPTIONS或仅是*
  • Access-Control-Allow-Headers-允许浏览器发送到后端的所有标头的逗号分隔列表,因此authorization, user-agent, host, accept, content-type...*

这里是一个很好的例子,它是如何设置的:https://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/websocket.html#websocket-server-allowed-origins

@Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/myHandler").setAllowedOrigins("http://test.com"); }

基本上,您需要使用您的域(也称为setAlowedOrigins

您的端口,如果有])或http://localhost来呼叫*。我想设置其他CORS标头也将对完整的浏览器支持有所帮助]

© www.soinside.com 2019 - 2024. All rights reserved.