在Spring Boot(Websockets)中
我刚刚看到了这个例子:
messaging.convertAndSendToUser( username, "/queue/notifications",
new Notification("You just got mentioned!"));
这个人从哪里得到用户名?我找不到任何提到获取用户名的地方...
在Spring Boot(Websockets)中
我刚刚看到了这个例子:
messaging.convertAndSendToUser( username, "/queue/notifications",
new Notification("You just got mentioned!"));
这个人从哪里得到用户名?我找不到任何提到获取用户名的地方...
本答案基于这个应用程序撰写: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
中我犯了一个错误,已经进行了更正(涉及名称解析部分)。
SimpUserRegistry
的空集合中仍然没有SimpUser
。 - durisvk10