更改 websocket 范围(从应用程序到 session/view)

Change websocket scope (from application to session/view)

我通过教程创建了一个基本的网络套接字。

这是一个配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/chat");
         registry.addEndpoint("/chat").withSockJS();
    }
}

这里是消息处理控制器:

@MessageMapping("/chat")
@SendTo("/topic/messages")
public OutputMessage send(Message message) throws Exception {
    return new OutputMessage("Hello World!");
}

一切正常,但根据我的调查,WebSockets 默认情况下似乎有一个应用程序范围(通过连接到频道,我可以看到所有用户的所有调用)。

我想做的是只能看到来自当前用户会话或当前视图的调用。 关于如何应用这些配置有什么想法吗?

我能够解决这个难题,所以我与您分享我的发现。

首先,我发现一个简单的内存消息代理无法处理的信息:

    /*
     * This enables a simple (in-memory) message broker for our application.
     * The `/topic` designates that any destination prefixed with `/topic`
     * will be routed back to the client.
     * It's important to keep in mind, this will not work with more than one
     * application instance, and it does not support all of the features a
     * full message broker like RabbitMQ, ActiveMQ, etc... provide.
     */

但这是一种误导,因为它可以通过 @SendToUser 注释轻松实现。 此外,重要的是现在在客户端,您需要在订阅频道时添加一个额外的前缀 /user/,因此解决方案是:

  1. 在服务器端:将@SendTo("/topic/messages")更改为@SendToUser("/topic/messages")
  2. 在客户端:/topic/messages 进入 /user/topic/messages