问题标签 [stompjs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
27 浏览

spring - 弹簧网络套接字 403

用例:转到 examplesite.com,然后单击一个按钮进行 websocket 连接。websocket 握手得到 403

reponse.websocket 请求:

请求头是:

在代码部分中,如果配置类似的代码

或者

这使得请求没有问题。

但我想知道为什么必须做这个额外的配置?wss://examplesite.com/* 和https://examplesite.com不被视为同源?

一件事是服务器在vip后面,例如e

0 投票
1 回答
628 浏览

java - 使用 STOMP 关闭 Websocket 连接

目前,我有一个以Websocket和Stomp作为消息传递子协议的项目,我需要管理Websocket上的断开事件和重新连接事件。如果服务器和客户端之间没有消息,我的最终目标是在 5 秒后关闭与 STOMP 的 WebSocket 会话。在服务器和客户端中设置时,我对心跳值感到非常困惑。例如,我在客户端中设置了这些心跳值(使用Stomp.js):

这是我在服务器端(Spring Boot)上的心跳值:

所以我在服务器端设置了这个值,它会每5秒发送一条PONG消息,但是在客户端,它希望在1s内收到消息,但是当它等待超过一秒时,连接仍然在那里,WebSocket 仍在工作。

如果我改变一侧的一个值以及它如何影响另一侧?以及如何使用这些心跳值断言连接将在特定时间关闭?非常感谢。

0 投票
1 回答
246 浏览

angular - SockJS 403 错误,即使启用了 setAllowedOrigins("*")

我正在使用 spring boot angular 创建一个演示聊天应用程序。我已经使用 Spring Security 实现了 JWT 身份验证。我能够成功进行身份验证,但无法建立成功的 WebSocket 连接。它失败并出现以下错误:

这很奇怪,因为在 WebSocket 配置中我启用了允许来源。

以下是后端的配置:

  • 使用 jwt 的应用程序安全配置
  • 在 WEB MVC 配置中启用 CORS
  • WebSocket 配置
  • WebSocket 安全配置
  • 负责与后端连接的 Angular 聊天服务:
  • 认证后,用户重定向了聊天组件:

我已经尝试使用邮递员使用以下 URI:

  • 网址:http://localhost:8090/chatal
  • 方法:获取
  • 授权:不记名令牌...
  • 结果:欢迎使用 SockJS!

  • 网址:http://localhost:8090/chatal/info?t=1617904524809
  • 方法:获取
  • 授权:不记名令牌...
  • 结果: {"entropy":1335940544,"origins":[" : "],"cookie_needed":true,"websocket":true}

此解决方案不起作用:

该方法setAllowedOriginPatterns不存在,如下所示:

在此处输入图像描述

0 投票
0 回答
52 浏览

reactjs - React stompjs 连接不会抛出错误

我想连接我的插座。当连接成功建立时,成功消息会正确打印,但当套接字连接失败时,连接不会抛出或打印任何错误。我尝试了 try and catch 方法,提供了 errorCallback 函数,但没有抛出或打印错误消息。

0 投票
0 回答
242 浏览

reactjs - react-stomp-hooks useStompClient hook 在页面刷新时设置为 undefined

我正在使用react-stomp-hooks包与我的后端建立 websocket stomp 连接。我有一个函数组件,它呈现我定义的某个页面,const stompClient = useStompClient()在组件安装上我有一个 useEffect(),它应该在第一次渲染后直接通过 stomp 发布。现在的问题是,当我刷新页面时,我定义的 stompClient 未定义,但是在第一次渲染页面时(通过从另一个页面路由),一切正常。确切的 TypeError 是无法读取 undefined 的属性“发布”。我在这里没有看到什么?查看我的代码:

编辑1:

我认为stompClient设置为未定义,因为必须在页面刷新时再次设置与后端的连接,并且useEffect在此设置发生之前调用。所以我需要一种方法来触发stompClient.publish()唯一的连接建立后,但我不知道如何实现这一点。我最重要<App/>的组件是将所有内容包装在一个<StompSessionProvider/>(请参阅链接的包文档)中,但是我如何才能收听这个 StompSessionProvider 的已建立连接?

0 投票
1 回答
209 浏览

javascript - StompJs 启动两个 websocket 连接

React 应用程序,@stomp/stompjs 库

如果我启动 React 应用程序,它会打开 2 个 websocket 连接。 控制台日志 网络日志

如果我构建并将其部署到服务器,它只会打开一个连接。 控制台日志 网络日志

聊天.js

包.json

我不想总是构建我的应用程序或接收双重事件。我该如何解决?

0 投票
1 回答
241 浏览

reactjs - 无法在反应中读取未定义的属性“发布”

如果我对消息进行硬编码并发布该方法,则在我的 handleSubmit 方法中按预期工作。但是,如果我用输入状态替换“hello stomp”或使用任何输入提交,我会得到 Uncaught TypeError: Cannot read property 'publish' of undefined” 任何见解将不胜感激

0 投票
1 回答
421 浏览

spring-boot - STOMP over WebSockets:Spring Boot 需要 JSON;NodeJs STOMP.js 客户端无法连接

在尝试基于 WebSockets 的 STOMP 时,我注意到不同实现之间的不一致,即 Spring Boot Java 实现和使用 STOMP.js 编写的 NodeJs 客户端之间的不一致

当调试到它时,不同的是在 Spring Boot 应用程序中,CONNECT消息应该是一个 JSON 数组。例如,此消息由他们的测试客户端发送(使用SocksJS库以 JavaScript 编写):

相比之下,我的 NodeJs STOMP.js 测试客户端(代码如下)发送以下帧:

不幸的是,我对 STOMP 没有经验,但是在阅读了规范之后,我不明白为什么 Spring Boot 期望将数据表示为 JSON 数组。这是一个已知问题吗?


为了演示,让我分享两个示例运行。一次成功运行以连接到 RabbitMQ,然后尝试连接 Java Spring Boot 应用程序失败。(可以在最后找到带有代码的可重复设置。)

  1. 连接到 RabbitMQ 实例,该实例配置为使用 STOMP over WebSockets(在 上运行ws://localhost:15674/ws):
  1. 现在连接(不成功)到 Spring Boot 应用程序(ws://localhost:5555/chat/123/k2qn3dl7/websocket):

它失败的原因是 Jackson(JSON 解析器)未能解析该有效负载:

如前所述,在 Spring Boot 示例附带的客户端中,有效负载如下所示:


这是 Spring Boot 应用程序中的完整错误:

重现路径:

  1. NodeJs 客户端代码
  2. Spring Boot 测试应用
  3. RabbitMQ 测试实例

  1. 用 NodeJs 编写的客户端代码:

  1. 可以在此处找到 Spring Boot 应用程序。我在端口 5555 上启动它:

注意:如果您随后转到http://localhost:5555,您将看到由 Spring Boot 应用程序提供的聊天应用程序。单击连接时,将建立一个 STOMP 连接。

火狐网络监视器


  1. 要启动 RabbitMQ,您可以使用STOMP.js 中用于测试的Docker 容器:
0 投票
0 回答
145 浏览

spring-websocket - Spring Websocket 不使用@stomp/stompjs 监听取消订阅事件

我有一个 spring websocket 项目并创建了一个非常基本的页面来测试它,一切似乎都工作正常,除了 UNSUBSCRIBE 消息的侦听器。

当前端进行订阅时,我从侦听器获得第一个打印,但是当它取消订阅时,不会触发侦听器。您可以在 Chrome 的 websocket 日志中看到 UNSUBSCRIBE 消息已发送:

这是我在订阅前端的代码:

const subscription = await WebSocketService.subscribe(`/topic/myTopic`);

这是我的退订代码:

正如您从 Chrome 日志中看到的那样,正在发送 UNSUBSCRIBE 消息,但我的侦听器没有触发。有任何想法吗 ?

0 投票
0 回答
27 浏览

rabbitmq - Spring Websocket RabbitMQ中重连后的链路复用问题

我在用;

  • 后端带有 Spring 集成的 RabbitMQ Websocket;(spring-boot-starter-parent:2.3.0.RELEASE,spring-cloud-dependencies:Hoxton.SR5)
  • 前端的“react-stomp 5.1.0”

我安装了带有 3 个实例的 RabbitMQ 集群。

我的问题是:如果我关闭集群中的一个实例,我的 websocket 连接会被多路复用。

我搜索了这个问题,但找不到任何东西。我注意到当其中一个节点关闭时,客户端会定期请求重新连接。在我看来,这是预期的行为。但是,当连接成功执行时,我看到连接数比以前的状态增加更多。

例如 ; 一开始有20个连接。当其中一个rabbit节点掉线时,连接数首先减少(例如:12),然后客户端请求重新连接,然后连接数增加到30,比初始连接数20多。

如果存在,我错过了什么?谁能帮我?