Development/Java

[Spring boot] Websocket connect / disconnect 관련

반응형

spring boot로 websocket을 개발하다보면 Session의 Connect / Disconnect 되는 시점을 알고 싶을 때가 있는데

(사용자 동시 접속 리스트 관리 차원)


그때는 ChannelInterceptorAdapter를 사용하면 된다.



@Component
public class StompHandler extends ChannelInterceptorAdapter {
    private final Logger logger = getLogger(this.getClass());

    @Override
    public void postSend(Message message, MessageChannel channel, boolean sent) {
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
        String sessionId = accessor.getSessionId();
        switch (accessor.getCommand()) {
            case CONNECT:
                // 유저가 Websocket으로 connect()를 한 뒤 호출됨
                break;
            case DISCONNECT:
                // 유저가 Websocket으로 disconnect() 를 한 뒤 호출됨 or 세션이 끊어졌을 때 발생함(페이지 이동~ 브라우저 닫기 등)
                break;
            default:
                break;
        }

    }
}


이렇게 상속받아 구현을 해서 Bean으로 등록을 한다(@Component)


그 후, 해당 인터셉터를 websocket의 설정 부분에 달아주면 된다



@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Autowired
    private StompHandler stompHandler;

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic", "/queue"); // 해당 api를 구독하는 클라이언트에게 메세지 전송
//        config.enableStompBrokerRelay("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/some_prefix"); // 클라이언트로부터 받을 prefix
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/battleroyale").setAllowedOrigins("*").withSockJS(); // 클라이언트에서 연결할 websocket 설정
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(stompHandler);
    }
}



configureClientInboundChannel 부분을 override 해서 ChannelRegistration 부분에 인터셉터를 달아준다.


그러면 유저의 CONNECT와 DISCONNECT 할때의 정보를 가져올 수 있다.


그 세션의 데이터는 StompHeaderAccessor 를 통해서 얻어올 수 있다(각종 웹소켓 관련 정보)


간단하게 세션의 ID를 가져오려면


accessor.getSessionId() 를 호출하면 된다


자세한 정보 : https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/messaging/simp/stomp/StompHeaderAccessor.html



반응형