Поскольку клиент подписывается на очередь «/user/monitor», аннотация сервера @SubscribeMapping должна быть «/user/monitor», а не «/user/monitor{something}».
Сервер может понять, что такое клиент, в зависимости от вашей схемы аутентификации. Если вы используете веб-сокет sockjs, вы можете использовать HTTP-аутентификацию и, следовательно, использовать Spring Security и добавить параметр «Principal» в свою функцию, которая будет содержать информацию о пользователе:
@SubscribeMapping("/monitor")
public void init(Principal p) {
String user = p.getName();
messagingTemplate.convertAndSendToUser(user, "/monitor", getOps());
}
Если вы не используете HTTP-аутентификацию, вы можете отправить серверу информацию о пользователе, например, добавив собственный заголовок STOMP, к которому можно получить доступ с сервера с помощью SimpMessageHeaderAccessor:
@SubscribeMapping("/monitor")
public void init(SimpMessageHeaderAccessor accessor) {
String user = accessor.getFirstNativeHeader("userid");
messagingTemplate.convertAndSendToUser(user, "/monitor", getOps());
}
Другим способом может быть подписка на другое имя очереди, которое содержит информацию о пользователе (и это, возможно, было вашим предложением). Клиент должен использовать код, похожий на:
stompClient.subscribe('/topic/byUser/'+userId, function(msg) {
console.log(msg);
});
чтобы сервер мог получить к нему доступ следующим образом:
@SubscribeMapping("/byUser/{userId}")
public void init(@DestinationVariable String userId) {
messagingTemplate.convertAndSendToUser(userId, "/monitor", getOps());
}
но в этом случае имейте в виду, что эта очередь является общедоступной, и, следовательно, другие клиенты могут получить доступ к своим сообщениям, если они знают имена других клиентов.
person
Alessandro Polverini
schedule
28.07.2014