在Spring Websocket上向特定用户发送消息
如何仅从服务器向特定用户发送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:run
2)导航到http://localhost:8080
,使用bob / test或jim / test登录
3)单击“请求用户特定的消息”。预期:仅此用户的“仅收到我的消息”旁边显示消息“ hello {username}”,实际:未收到任何消息
回答:
哦,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
以上是 在Spring Websocket上向特定用户发送消息 的全部内容, 来源链接: utcz.com/qa/413312.html