Spring Websockets @SendToUser без входа в систему?
-
02-01-2020 - |
Вопрос
У меня есть простое приложение spring с функциональностью websocket, и пока все работает.Теперь я хочу отправить сообщение с моего сервера определенному клиенту, используя аннотацию @SendToUser.Это выдает мне ошибку "Игнорируя сообщение, основная информация недоступна".Я понимаю, что у меня вообще нет логина на моем сервере, поэтому каждый пользователь является "анонимным" и не имеет участника (сейчас я не использую spring security).Но у каждого пользователя есть идентификатор сеанса.Разве нельзя каким-то образом использовать идентификатор сеанса для различения пользователей?Как я могу добиться этого, чтобы мои пользователи получали участника, который соответствует идентификатору сеанса?
Решение
Я думаю, что решение могло бы заключаться в том, чтобы избежать использования @SendToUser
и использовать сырое SimpMessagingTemplate
и отправлять сообщения в пункт назначения, который вы контролируете для открытых сеансов.
Например.предполагая, что у вас был некоторый идентификатор для нового сеанса websocket, вы можете подписаться на очередь с этим идентификатором в имени очереди:
stomp.subscribe("/queue/chats" + "-" + mycustomidentifier, onmessage);
Теперь, на стороне слушателя Spring websocket, вы можете направлять свои ответы, используя SimpMessagingTemplate
:
@Controller
public class MyController {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/chats")
public void handleChat(@Payload ChatMessage message) {
this.simpMessagingTemplate.convertAndSend("/queue/chats-" + "mycustomidentifier", "[" + getTimestamp() + "]:" + message.getMessage());
}
....
Другие советы
Используйте @SendToUser
и добавить «/ пользователя /» перед очередью, когда подписывается (только сторона абонента).Отдых работает Magic: -)
вместо
Java Server: @SendTo("/topic/showResult")
.
и
JS Client: stompClient.subscribe('/topic/showResult', function(calResult){ ....
.
Использование:
Java Server: @SentToUser("/topic/showResult")
и
JS Client: stompClient.subscribe('/user/topic/showResult', function(calResult){ ....
Строительство на Ответ Biju и используя идентификатор сеанса
Попробуйте это.Работало для меня
@Autowired
private SimpMessagingTemplate messagingTemplate;
@MessageMapping("/getHello")
public void sendReply( MessageHeaders messageHeaders, @Payload String message, @Header(name = "simpSessionId") String sessionId){
messagingTemplate.convertAndSendToUser(sessionId, "/queue/hello", "Hello "+ message, messageHeaders);
}
.