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

Spring WebSocket如何向特定用户发送消息?

陆甫
2023-03-14

我正在阅读《Spring in Action4》一书,以使用WebSocket上的STOMP消息传递。

假设用户目标前缀设置为“/user”,如下所示:

registry.setUserDestinationPrefix("/user");

然后客户端使用以下JavaScript代码订阅目标:

stomp.subscribe("/user/queue/notifications", handleNotifications);
/queue/notifications-user6hr83v6t  --- (1)
messaging.convertAndSendToUser( username, "/queue/notifications",
                           new Notification("You just got mentioned!"));

则该消息将发送到目的地,如下所示:

/user/<username>/queue/notifications  ---(2)

那么,两个目的地(1)(2)看起来是不同的,消息怎么可能到达客户端呢?

共有1个答案

金嘉
2023-03-14

小路

/user/<username>/queue/notifications 

似乎是文档中使用的“逻辑”路径。它最初也是用convertAndSendToUser方法创建的。然后将其转换为技术格式,在本行的UserDestinationMessageHandler类中完成

UserDestinationResult result = this.destinationResolver.resolveDestination(message);

例如

stompClient.subscribe('/user/queue/reply', function (greeting) { ...
stompClient.send("/app/personal", ...
@MessageMapping("/personal")
public void personalMessage(SimpMessageHeaderAccessor headerAccessor, PoCRequestMessage message) {

    SimpMessageHeaderAccessor ha = SimpMessageHeaderAccessor
            .create(SimpMessageType.MESSAGE);
    ha.setSessionId(headerAccessor.getSessionId());
    ha.setLeaveMutable(true);
    PoCReplyMessage reply = new PoCReplyMessage("Personal Message" + message.getName());
    simpMessagingTemplate.convertAndSendToUser(headerAccessor.getSessionId(), "/queue/reply", reply, ha.getMessageHeaders());
}

目标将按以下方式解析:

source destination: /user/zojdn53y/queue/reply
target destination: /queue/reply-userzojdn53y

这就是最终目标名称的解析方式。目标目的地是所创建队列的真实名称(至少在使用外部消息代理的情况下是这样的-没有检查是否有简单的内存中代理,但我假设这是一样的)。

需要注意的一件重要事情是,当您希望使用未经身份验证的用户时(在使用WebSocket进行实验时,最常见的情况是),您需要另外将消息头放在convertAndSendToUser方法中-这在Spring WebSocket@SendToSession:send message to specific session中有很好的描述

 类似资料:
  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。

  • 问题内容: 我从socket.io + node.js开始,我知道如何在本地发送消息和广播功能:-所有连接的客户端都收到相同的消息。 现在,我想知道如何向特定的客户端发送私人消息,我的意思是一个套接字,用于2个人之间的私人聊天(客户端到客户端流)。谢谢。 问题答案: 当用户连接时,它应使用唯一的用户名(例如电子邮件)向服务器发送消息。 一对用户名和套接字应存储在这样的对象中: 在客户端上,使用以下

  • 我使用本教程中描述的spring设置了一个WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/。我需要的是我的服务器每5秒向特定用户发出一条消息。所以我首先做了这个: 而且起作用了。现在,为了只向特定用户发送消息,我更改了以下内容: 在WebSocketConfig.java中添加队列: 更改GreetingControl

  • 假设我在MongoDB中有以下模式: 每个帖子必须有一个所有者,并且可能有许多贡献者(由所有者添加)。 当所有者或任何贡献者对post对象进行更改时,我需要将该更改实时通知给所有相关的用户(使用Socket。IO)。 但是我对如何做到这一点有一些疑问...我的意思是,我知道 Socket.IO 有一些方法可以向特定用户发出消息,但我们需要知道 SocketID。如何将用户 ID 与套接字 ID 相

  • 问题内容: 如何仅从服务器向特定用户发送websocket消息? 我的webapp具有spring安全设置,并使用websocket。我在尝试仅从服务器向特定用户发送消息时遇到棘手的问题。 通过阅读手册,我的理解是来自我们可以做的服务器 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的方法,但是没有运气。 如果我将其发送到/ topic / reply,它可以工作,但所有其他已连接用户也