为了账号安全,请及时绑定邮箱和手机立即绑定

在Spring Websocket上向特定用户发送消息

在Spring Websocket上向特定用户发送消息

牛魔王的故事 2019-10-26 12:22:19
如何仅将Websocket消息从服务器发送到特定用户?我的webapp具有spring安全设置,并使用websocket。我在尝试仅从服务器向特定用户发送消息时遇到棘手的问题。通过阅读手册,我的理解是来自我们可以做的服务器simpMessagingTemplate.convertAndSend("/user/{username}/reply", reply);在客户端:stompClient.subscribe('/user/reply', handler);但是我永远无法调用订阅回调。我尝试了许多不同的方法,但是没有运气。如果我将其发送到/ topic / reply,它可以工作,但所有其他已连接用户也将收到它。为了说明问题,我在github上创建了这个小项目:https : //github.com/gerrytan/wsproblem重现步骤:1)克隆并构建项目(确保您使用的是jdk 1.7和maven 3.1)$ git clone https://github.com/gerrytan/wsproblem.git$ cd wsproblem$ mvn jetty:run2)导航到http://localhost:8080,使用bob / test或jim / test登录3)单击“请求用户特定的味精”。预期:仅此用户的“仅收到我的消息”旁边会显示一条消息“ hello {username}”,实际:未收到任何消息
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

哦,client side no need to known about current user服务器会为您做到这一点。


在服务器端,使用以下方式将消息发送给用户:


simpMessagingTemplate.convertAndSendToUser(username, "/queue/reply", message);

注意:使用queue,而不是topic,Spring始终queue与一起使用sendToUser


在客户端


stompClient.subscribe("/user/queue/reply", handler);

说明


当任何websocket连接打开时,Spring会为其分配一个session id(而不是HttpSession为每个连接分配)。当您的客户订阅以开头的频道/user/(例如:)时/user/queue/reply,您的服务器实例将订阅一个名为queue/reply-user[session id]


使用发送消息给用户时,例如:用户名是admin 您将写simpMessagingTemplate.convertAndSendToUser("admin", "/queue/reply", message);


Spring将确定哪个session id映射到user admin。例如:它发现了两个会话wsxedc123和thnujm456,Spring会将其转换为2个目标queue/reply-userwsxedc123和queue/reply-userthnujm456,并将带有2个目标的消息发送到消息代理。


消息代理接收消息,并将其提供回服务器实例,该实例对应于每个会话(WebSocket会话可以由一个或多个服务器保留)。Spring会将消息翻译为destination(例如:)user/queue/reply和session id(例如:)wsxedc123。然后,它将消息发送到相应的Websocket session


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 1484 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信