spring boot web socket中的实时通知

Vir*_*rat 5 java spring websocket spring-boot spring-websocket

在我的应用程序中,我需要向特定用户发送实时通知。我的WebSocketConfig课如下,

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
        @Override
        public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
            stompEndpointRegistry.addEndpoint("/websocket-example")
                    .withSockJS();
        }

        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            registry.enableSimpleBroker("/topic");
    }
}
Run Code Online (Sandbox Code Playgroud)

大多数时候信息会由服务器端发送。所以我还没有设置应用程序目的地。

在客户端,我订阅了目标“/topic/user”,

function connect() {
    var socket = new SockJS('/websocket-example');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/user', function (greeting) {
//            showGreeting(JSON.parse(greeting.body).content);
console.log("Received message through WS");
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

RestController我的一个方法中,我有一种方法可以将消息广播给所有连接的客户端。

    @GetMapping("/test")
    public void test()
    {
        template.convertAndSend("/topic/user", "Hurray");
    }
Run Code Online (Sandbox Code Playgroud)

直到这部分一切正常。我收到消息并正在登录到控制台。

现在,如果我只想将通知发送给特定用户,则必须使用template.convertAndSendToUser(String user, String destination, String message). 但我不明白我应该传递给user参数的内容。我将在何时何地获得user

我经历了几个与此相关的问题,但我并没有清楚地理解这些概念。

Dev*_*tna 0

username是 的一部分java.security.Principal interface。每个 StompHeaderAccessor 或 WebSocket 会话对象都有一个该原理的实例,您可以从中获取用户名。它不是自动生成的。It has to be generated manually by the server for every session.

您可以在此处查看有关为每个会话生成唯一 ID 的更多信息。

然后像这样使用:

@MessageMapping('/test')
public void test(SimpMessageHeaderAccessor sha)
{
  String userName = sha.session.principal.name;
  template.convertAndSend(userName, '/topic/user', "Hurray");
}
Run Code Online (Sandbox Code Playgroud)