복붙노트

[SPRING] 봄 세션 + 봄 웹 소켓. 세션 ID를 기반으로 특정 클라이언트에게 메시지 보내기

SPRING

봄 세션 + 봄 웹 소켓. 세션 ID를 기반으로 특정 클라이언트에게 메시지 보내기

나는 sessionId를 기반으로 특정 클라이언트에게 메시지를 보내기 위해 스택 오버 플로우에서 Quetion1과 Quetion2를 추적했지만 성공을 찾지 못했습니다.

아래 샘플은 RestController 클래스입니다.

@RestController
public class SpringSessionTestApi {

@Autowired
public SimpMessageSendingOperations messagingTemplate;

@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception {

    String sessionId  = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID");
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId));

   }

private MessageHeaders createHeaders(String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    return headerAccessor.getMessageHeaders();
   }
}

Session Id : 클라이언트가 createSession 요청을 보내면 새로운 spring sessionId가 생성되고 MongoDB에도 저장됩니다. 그런 다음 클라이언트가 웹 소켓 연결 요청을 보내면 예상대로 mongoDb에 저장된 동일한 sessionId가 수신됩니다. 모든 것이 잘 작동 할 때까지.

이제는 sessionId를 기반으로 클라이언트에게 응답을 보냅니다. 그 때문에 나는 웹 소켓 클래스 아래있다.

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
    AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {

@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/messages");
}

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

연결에 사용하는 샘플 클라이언트 코드는 다음과 같습니다.

function connect() {

stompClient = Stomp.client('ws://localhost:8016/messages');
stompClient.debug = null;

stompClient.connect({}, function (frame) {
    setConnected(true);
    console.log('Connected: ' + frame);
    stompClient.subscribe('/user/queue/test', function (greeting) {
        console.log("Hello "+greeting);
        console.log("Greeting body "+JSON.parse(greeting.body));

    });
});
}

제발 도와주세요, 내가 잘못하고있는 곳? 미리 감사드립니다.

해결법

  1. ==============================

    1.사용자 채널을 사용하는 경우 여기에 명시된대로 사용자를 전달하십시오.

    사용자 채널을 사용하는 경우 여기에 명시된대로 사용자를 전달하십시오.

    @MessageMapping("/messages")
    public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal) 
        throws Exception {
        messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message);
    }
    
  2. ==============================

    2.나는 git에서 Spring Stomp Chat 프로젝트를 발견했다. 링크는 여기에있다. 당신은 그것을 참조 할 수 있습니다. https://gist.github.com/theotherian/9906304

    나는 git에서 Spring Stomp Chat 프로젝트를 발견했다. 링크는 여기에있다. 당신은 그것을 참조 할 수 있습니다. https://gist.github.com/theotherian/9906304

  3. from https://stackoverflow.com/questions/43536507/spring-session-spring-web-socket-send-message-to-specific-client-based-on-ses by cc-by-sa and MIT license