Как этот вопрос, я хочу отправить конкретному пользователю с его идентификатором сеанса.
И я пытаюсь ответить решение, но клиентская сторона все еще не получает сообщение.
Это моя установка.
Я сохраняю идентификатор сеанса пользователя, когда они подключаются к серверу
@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");
}
Но как этот решение, он не требует аутентификации пользователя. Как это работает? Я просто обновляю свою конфигурацию на свой вопрос. Я мог получить широковещательное сообщение из "/ queue", но не личное сообщение.




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