当前位置: 首页 > 知识库问答 >
问题:

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

尤博达
2023-03-14

我遇到了一个问题,试图在Angular 9应用程序中打开SockJS套接字,并使用SimpMessageTemboard从Spring后端写入此套接字。此任务的主要目标是实时接收和显示传入数据,而不进行外轮询。

我的原始实现基于mouadelfakir完成的现有存储库,但实现使用了较旧版本的软件(Angular~1和Spring Boot~1.5)。当更新到新版本时,Angular 9更新没有改变应用程序的工作方式,但升级到Spring Boot 2.2.6会破坏实现。

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

- 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

在写这篇文章的时候,我已经尝试了很多我在网上看到的建议的其他补救措施,比如创建一个Angular应用程序运行的代理,或者在Spring中实现一个过滤器来添加跨源请求策略,但是没有任何效果。这些帖子大部分都比较旧,我觉得由于软件更新,它们可能不再有效。

下面是我目前使用的示例存储库分支,它的特点是我正在尝试使用的软件升级。

编辑:感谢对此的反馈,我能够解决这个问题。它是由升级到较新版本的Spring引起的,但实际上是由于原始开发在application.properties中使用的密钥的弃用,该密钥不断从我身边滑落。如果有人需要,我的当前分叉上存在更新的代码。

共有1个答案

丁书
2023-03-14

您使用的示例是2岁。即使是现在,也不是所有的浏览器都有内置的CORS支持,这就是问题所在。

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

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

>

访问-控制-允许-方法-以逗号分隔的浏览器允许创建的HTTP方法列表,因此要么是GET、POST、PUT、DELETE、OPTIONS,要么只是*

访问-控制-允许-标题-浏览器被允许发送到后端的所有标题的逗号分隔列表,因此授权,用户代理,主机,接受,内容类型...*

这里有一个如何设置的好例子: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");
    }

基本上,您需要使用您的域(aka)调用setAlowedOriginshttp://localhost:your端口(如果有)或*。我认为设置其他CORS头也有利于对浏览器的全面支持

 类似资料:
  • 当我使用HTML2Canvas评估图像时,我得到了这个错误。 CORS策略阻止从来源“http://localhost:8080”访问位于“http://testdomain.com/storage/images/products/user_front.png”的映像:请求的资源上没有“Access-Control-Allow-Origin”标头。 下面是我的cors配置。 有人能帮我吗?

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。

  • 我的应用程序最近收到一个错误 “在'https://my-service-domain/socket.io/?EIO=3 当我连接到 socket.io。我还没有找到这个问题的解决方案,我将详细描述如下图所示,是否有人遇到过此错误。 服务器配置: 客户端配置: 我试图切换webocket连接选项,我得到了错误 "WebSocket连接到'wss://my-service-field/socket.

  • 我有一个在Node开发的API。JS,打字稿听localhost:3001我有一个Angular的前端应用程序,打字稿听localhost:4200 我正在尝试使用ngx-image-cropper上传图像文件,将其转换为base 64,从前端到API。 当补丁(更新)http请求发送到API时,我得到: 访问位于'http://localhost:3001/member/10'从原点'http:

  • 请不要将此标记为重复。我已经阅读了关于堆栈溢出的每一个相关答案,并且还没有找到这个问题的明确解决方案。 我现在正在使用带有axios的vue服务器来尝试从https://coinmarketcap.com.获取数据并显示它。问题是,我在chrome控制台上收到一条错误消息: 从https://api.coinmarketcap.com/v1/ticker到https://api.coinmarke

  • 有一个应用程序在角7也有一个. net web api解决方案,当我调用一个动作CORS问题发生,错误如下 CORS策略阻止从http://localhost:57467/UserDetails/GetUserDetailshttp://localhost:4200访问XMLHttpRequest:对预试请求的响应不通过权限改造检查:请求的资源上不存在访问控制允许起源标头。 我试图使用Web ap