简单:convertAndSendToUser我在哪里可以获得用户名?

时间:2017-07-27 17:17:35

标签: java spring spring-boot websocket spring-websocket

在Spring Boot(Websockets)中

我刚看到这个例子:

messaging.convertAndSendToUser( username, "/queue/notifications",
                       new Notification("You just got mentioned!"));

这家伙从哪里获得用户名?我找不到任何关于在哪里获得该用户名的提及......

1 个答案:

答案 0 :(得分:1)

这个答案是基于这个应用程序编写的:https://github.com/spring-guides/gs-messaging-stomp-websocket

要注册用户,您必须首先创建一个代表它的对象,例如:

public final class User implements Principal {

    private final String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }
}

然后,您需要一种方法来创建这些User个对象。一种方法是在SockJS向您发送连接邮件标头时。为此,您需要拦截连接消息。你可以通过创建我们的拦截器来做到这一点,例如:

public class UserInterceptor extends ChannelInterceptorAdapter {

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {

        StompHeaderAccessor accessor =
                MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

        if (StompCommand.CONNECT.equals(accessor.getCommand())) {
            Object raw = message
                    .getHeaders()
                    .get(SimpMessageHeaderAccessor.NATIVE_HEADERS);

            if (raw instanceof Map) {
                Object name = ((Map) raw).get("name");

                if (name instanceof LinkedList) {
                    accessor.setUser(new User(((LinkedList) name).get(0).toString()));
                }
            }
        }
        return message;
    }
}

完成后,您还必须注册此UserInterceptor。我在你的应用程序的某个地方猜测你已经定义了一个配置AbstractWebSocketMessageBrokerConfigurer类。在此类中,您可以通过重写configureClientInboundChannel方法来注册用户拦截器。你可以这样做:

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.setInterceptors(new UserInterceptor());
}

最后,当您的客户连接时,他们必须提供用户名:

stompClient.connect({
    name: 'test' // Username!
}, function () {
    console.log('connected');
});

完成所有这些设置后,simpUserRegistry.getUsers()将返回用户列表,您将能够使用convertAndSendToUser方法:

messaging.convertAndSendToUser("test", ..., ...);

修改

稍微进行测试,在订阅时,您必须在/user前面加上SimpMessagingTemplate前缀,因为stompClient.subscribe('/user/...', ...); 将此作为默认前缀使用,例如:

UserInterceptor

我也在{{1}}犯了一个错误并纠正了它(名称解析部分)。