仅发送到某些连接 Spring Websockets

Send to certain connections only Spring Websockets

我正在使用 grails/groovy 所以请原谅奇怪的语法,我也是使用 websockets 的新手所以如果我以错误的方式解决这个问题请告诉我:

使用 spring websockets 我可以通过

向某些订阅用户发送消息
SimpMessagingTemplate brokerMessagingTemplate
users.each {
    brokerMessagingTemplate.convertAndSendToUser(it.id,"/topic/path",data)
}

但是,我只想向订阅用户发送消息,这些订阅用户已将特定 value/id 的用户 ID 传递给服务器。连接是在网页加载时初始化的,所以我想也许我可以添加一个 STOMP header 值,将此信息传递给服务器,服务器只将消息发送到与此匹配的连接。

var socket = new SockJS("/url/stomp");
var client = Stomp.over(socket);
var headers = {'additionalId': additionalId};
client.connect({}, function() {
    client.subscribe("/user/topic/path", function (data) {
}, headers);

首先,我不知道添加 header 值是否是执行此操作的正确方法,其次我不确定如何让 SimpMessagingTemplate 发送给那些在 header.

您可以这样使用 DestinationVariable 而不是 header:

brokerMessagingTemplate.convertAndSend("/topic/something.${additionalId}".toString(), data)

并使用

 @MessageMapping("/something.{additionalId}")
 protected String chatMessage(@DestinationVariable String additionalId, Principal principal, String data) { ... }

此外,您可能希望通过实施 TopicSubscriptionInterceptor() 来限制订阅特定 /something.{additionalId} 的用户,您可以在其中验证 Principal