【问题标题】:Send to certain connections only Spring Websockets仅发送到某些连接 Spring Websockets
【发布时间】:2016-07-22 07:33:58
【问题描述】:

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

使用 spring websockets 我可以通过

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

但是,我只想向订阅用户发送消息,这些用户已经向服务器传递了一个超出其用户 ID 的特定值/ID。一个连接在网页加载时初始化,所以我想也许我可以添加一个 STOMP 标头值,将这个信息传递给服务器,并且服务器只向匹配的连接发送消息。

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);

首先,我不知道添加标头值是否是正确的方法,其次我不确定如何将 SimpMessagingTemplate 发送给那些在标头中专门提供了附加 Id 的人。

【问题讨论】:

    标签: spring-mvc grails websocket stomp spring-websocket


    【解决方案1】:

    你可以使用DestinationVariable,而不是使用标题:

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

    并使用

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

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

    【讨论】:

    • 感谢您的回复,我还没有机会对此进行测试,但我会评论/标记为答案
    • hii.. 多重变量怎么样? /hello/{file}/{mycode} ?
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2011-05-17
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多