Spring WebSocket convertAndSendToUser для определенного идентификатора сеанса

Как этот вопрос, я хочу отправить конкретному пользователю с его идентификатором сеанса.

И я пытаюсь ответить решение, но клиентская сторона все еще не получает сообщение.

Это моя установка.

Я сохраняю идентификатор сеанса пользователя, когда они подключаются к серверу

@EventListener
private void handleSessionConnected(SessionConnectEvent event) {
    SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(event.getMessage());
    String username = headers.getNativeHeader("login").get(0);

    String sessionId = headers.getSessionId();

    User user = new User(username, sessionId);

    participantRepository.add(user);

    Success", headers.getMessageHeaders());
}

обработчик широковещательных сообщений в Контроллер

@MessageMapping("/chat")
public void handleChat(ChatMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception{
    logger.debug(">>>[CHAT MESSAGE]");
    JsonParser parser = new JsonParser();

    String jsonMessage = gson.toJson(message);
    JsonObject jsonObMessage = 
    parser.parse(jsonMessage).getAsJsonObject().get("map").getAsJsonObject();

    messagingTemplate.convertAndSend("/queue", message);

}

обработчик личных сообщений в Контроллер

@MessageMapping("/chat.{user}")
public void handlePrivateChat(@Payload ChatMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception{
    logger.debug(">>>[PRIVATE CHAT MESSAGE]");

    JsonParser parser = new JsonParser();
    SimpMessageHeaderAccessor responseAccessor = SimpMessageHeaderAccessor
            .create(SimpMessageType.MESSAGE);

    String jsonMessage = gson.toJson(message);
    JsonObject jsonObMessage = 
    parser.parse(jsonMessage).getAsJsonObject().get("map").getAsJsonObject();

    User toUser = activeUsers.getByName(jsonObMessage.get("to").getAsString());
    String destinateSessionID = toUser.getSessionID();
    responseAccessor.setSessionId(destinateSessionID);
    responseAccessor.setLeaveMutable(true);
    MessageHeaders responseMessageHeader =  responseAccessor.getMessageHeaders();

    if (toUser != null){
        messagingTemplate.convertAndSendToUser(destinateSessionID, "/queue", message, responseMessageHeader);
    }

}

Оба обработчика сообщений могли получить сообщение, но клиент мог получить только широковещательное сообщение. Все еще не мог найти ответа. Надеюсь, кто-нибудь сможет мне помочь. Спасибо.

Обновлять

В моем WebSocketConfig

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue", "/topic");
    registry.setApplicationDestinationPrefixes("/app");
}

Вы должны опубликовать еще немного своего кода, то есть ваш WebSocketMessageBrokerConfigurer. Но поведение, когда spring устанавливает сопоставление имени пользователя для веб-сокета, либо находится на уровне безопасности Spring, либо вам нужно объявить handshakeInterceptor, в котором вы заполняете Spring SecurityContextHolder. Имя пользователя, используемое методом convertAndSendToUser, является принципалом объекта, который находится в Spring SecurityContextHolder

maslan 06.11.2018 09:06

Но как этот решение, он не требует аутентификации пользователя. Как это работает? Я просто обновляю свою конфигурацию на свой вопрос. Я мог получить широковещательное сообщение из "/ queue", но не личное сообщение.

jamesaq12wsx 06.11.2018 09:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 671
0

Другие вопросы по теме