Вопрос

У меня есть простое приложение 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 и используя идентификатор сеанса STOPP (спасибо, Mariusz2108 В своем ответе на аналогичный вопрос ), вот что работал для меня (на основе не доступен доступомОт JavaScript (для Tomcat) это более сложная перспектива.

Попробуйте это.Работало для меня

@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);
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top