Как отправить сообщение через веб-сокет только одному пользователю?

Когда я отправляю сообщение, используя аннотацию @SendToUser, это делается. Я получаю сообщение на стороне клиента.

Но когда я отправляю сообщение с помощью msgTempl.convertAndSendToUser(...), я не могу получить ответ на своей стороне клиента.

Следуйте моему коду:

@RestController
public class NotifyController {

private final SimpMessagingTemplate messagingTemplate;

@Autowired
public NotifyController(SimpMessagingTemplate messagingTemplate) {
    this.messagingTemplate = messagingTemplate;
}

@MessageMapping("/chat.send")

/* @SendToUser("/queue/ns-queue")*/

public Message sendMessage(@Payload Message message, 
@Header("simpSessionId") String sessionId) {

    messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue", 
message);


    return message;
}

@MessageMapping("/chat.register")/*
@SendToUser("/queue/ns-queue")*/
public Message addUser(@Payload Message message,
                       SimpMessageHeaderAccessor headerAccessor, 
@Header("simpSessionId") String sessionId) {

    messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue", 
message);

    return message;
}

}

Всконфиг:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements 
WebSocketMessageBrokerConfigurer {

private final WebSocketConfigurationProperties configurationProperties;

@Autowired
public WebSocketConfiguration(WebSocketConfigurationProperties 
configurationProperties) {
    this.configurationProperties = configurationProperties;
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker(configurationProperties.getTopic());

config.
setApplicationDestinationPrefixes(configurationProperties.getAppPrefix());
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {

registry.addEndpoint(configurationProperties.getEndpoint()).withSockJS();
}

}

На стороне клиента:

 function connect(event) {
 username = document.querySelector('#name').value.trim();

 if(username) {
    usernamePage.classList.add('hidden');
    chatPage.classList.remove('hidden');

    var socket = new SockJS('/ns/ws/endpoint');
    stompClient = Stomp.over(socket);

    stompClient.connect({}, onConnected, onError);

 }
 event.preventDefault();
 }


 function onConnected(payload) {
 // Subscribe to the Public Topic
 stompClient.subscribe('/user/queue/ns-queue', onMessageReceived);

 // Tell your username to the server
 stompClient.send("/ns/ws/chat.register",
    {},
    JSON.stringify({sender: username, type: 'JOIN'})
 )

 connectingElement.classList.add('hidden');
 }

Я не использую весеннюю безопасность.

Помогите мне, пожалуйста! Почему я не могу отправлять и получать сообщения, когда использую SimpMessagingTemplate?


person resclub    schedule 09.09.2019    source источник


Ответы (1)


я нашел решение. Вам просто нужно было добавить sessionId в заголовки и передать эти заголовки методу convertAndSendTosUser следующим образом:

 private void sendMessageToUser(@Payload Message message,
                               @Header("simpSessionId") String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = 
               SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    messagingTemplate.convertAndSendToUser(sessionId,
            socketConfigurationProperties.getTopic(), message, 
    headerAccessor.getMessageHeaders());
  } 
person resclub    schedule 12.09.2019