จะส่งข้อความ websocket ถึงผู้ใช้เพียงคนเดียวได้อย่างไร

เมื่อฉันส่งข้อความโดยใช้คำอธิบายประกอบ @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;
}

}

WsConfig:

@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 ในส่วนหัวและส่งส่วนหัวนี้ไปยังวิธีการแปลง AndSendTosUser ดังนี้:

 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