【问题标题】:Websocket filtering messages for individual users个人用户的 Websocket 过滤消息
【发布时间】:2015-07-08 15:50:32
【问题描述】:

我正在创建一个使用 RabbitMQ 作为代理的 spring websocket 应用程序。有没有办法过滤用户将在频道上看到的 Web 套接字消息?

会有多人订阅该频道。

【问题讨论】:

  • 这个问题相当广泛。您是否希望将 Spring Web App 连接到 RabbitMQ 主题,然后根据消息将其发送到通过 Websockets 连接到服务器的不同客户端?
  • 这正是我想要做的
  • 通过网络传输的消息是什么样的?他们是否有任何您可以过滤的内容,例如用户 ID 或类似内容?
  • 是的,他们会有一个可以进行过滤的指示器。我只是在 spring websockets 中找不到某种 presend 拦截器。

标签: spring spring-boot spring-websocket spring-messaging


【解决方案1】:

为了能够在 Spring 中向通过 Web Sockets 连接的特定用户发送消息,您可以将 @SendToUser 注释与 SimpMessagingTemplate 结合使用

参考可以在这里找到 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-user-destination

但总之(取自参考) 首先设置您的主题

@Controller
public class PortfolioController {

    @MessageMapping("/trade")
    @SendToUser("/queue/position-updates")
    public TradeResult executeTrade(Trade trade, Principal principal) {
        // ...
        return tradeResult;
    }
}

实现自己的 UserDestinationResolver 或使用默认的 http://docs.spring.io/autorepo/docs/spring/4.1.3.RELEASE/javadoc-api/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.html

这会将您的路径从 /queue/position-updates 解析为唯一路径,例如 /queue/position-updates-username1234 我的建议是使用 UUID 或类似的东西来让人难以猜测

然后,当您想要发送消息时,trade.getUsername() 将替换您为频道名称选择的唯一 ID

public void afterTradeExecuted(Trade trade) {
        this.messagingTemplate.convertAndSendToUser(
                trade.getUserName(), "/queue/position-updates", trade.getResult());
    }

最后,在订阅时,您需要确保客户端订阅了正确的主题。这可以通过标头或 Json 消息向用户发送队列后缀来完成。

client.connect('guest', 'guest', function(frame) {

  var suffix = frame.headers['queue-suffix'];

  client.subscribe("/queue/error" + suffix, function(msg) {
    // handle error
  });

  client.subscribe("/queue/position-updates" + suffix, function(msg) {
    // handle position update
  });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多