[Spring boot] Websocket connect / disconnect 관련

2018. 6. 8. 17:05·Development/Java
반응형

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


static StompHeaderAccessorcreate(StompCommand command)
Create an instance for the given STOMP command.
static StompHeaderAccessorcreate(StompCommand command, java.util.Map<java.lang.String,java.util.List<java.lang.String>> headers)
Create an instance for the given STOMP command and headers.
protected MessageHeaderAccessorcreateAccessor(Message<?> message)
Build a 'nested' accessor for the given message.
static StompHeaderAccessorcreateForHeartbeat()
Create headers for a heartbeat.
java.util.Set<java.lang.String>getAcceptVersion() 
java.lang.StringgetAck() 
StompCommandgetCommand()
Return the STOMP command, or null if not yet set.
static StompCommandgetCommand(java.util.Map<java.lang.String,java.lang.Object> headers)
Return the STOMP command from the given headers, or null if not set.
java.lang.IntegergetContentLength() 
static java.lang.IntegergetContentLength(java.util.Map<java.lang.String,java.util.List<java.lang.String>> nativeHeaders) 
java.lang.StringgetDetailedLogMessage(java.lang.Object payload)
Return a more detailed message for logging purposes.
long[]getHeartbeat() 
java.lang.StringgetHost() 
java.lang.StringgetLogin() 
java.lang.StringgetMessage() 
java.lang.StringgetMessageId() 
java.lang.StringgetNack() 
protected java.util.Map<java.lang.String,java.util.List<java.lang.String>>getNativeHeaders() 
java.lang.StringgetPasscode()
Return the passcode header value, or null if not set.
static java.lang.StringgetPasscode(java.util.Map<java.lang.String,java.lang.Object> headers)
Return the passcode header value, or null if not set.
java.lang.StringgetReceipt() 
java.lang.StringgetReceiptId() 
java.lang.StringgetShortLogMessage(java.lang.Object payload)
Return a concise message for logging purposes.
java.lang.StringgetVersion() 
booleanisHeartbeat() 
voidsetAcceptVersion(java.lang.String acceptVersion) 
voidsetAck(java.lang.String ack) 
voidsetContentLength(int contentLength) 
voidsetContentType(MimeType contentType) 
voidsetDestination(java.lang.String destination) 
voidsetHeartbeat(long cx, long cy) 
voidsetHost(java.lang.String host) 
voidsetLogin(java.lang.String login) 
voidsetMessage(java.lang.String content) 
voidsetMessageId(java.lang.String id) 
voidsetNack(java.lang.String nack) 
voidsetPasscode(java.lang.String passcode) 
voidsetReceipt(java.lang.String receiptId) 
voidsetReceiptId(java.lang.String receiptId) 
voidsetSubscriptionId(java.lang.String subscriptionId) 
voidsetVersion(java.lang.String version) 
StompCommandupdateStompCommandAsClientMessage() 
voidupdateStompCommandAsServerMessage() 
static StompHeaderAccessorwrap(Message<?> message)
Create an instance from the payload and headers of the given Message.



반응형
저작자표시 동일조건 (새창열림)

'Development > Java' 카테고리의 다른 글

[JAVA/OS] /dev/random 관련 PRNG 오류  (0) 2018.06.17
[JAVA] 랜덤 퍼센트 계산하는 클래스(?)  (0) 2018.06.08
[Spring Boot] Resource load 관련  (0) 2018.06.08
[Spring Boot] Spring Security maximumSessions 관련  (0) 2018.06.08
SpringBoot Jackson(ObjectMapper) Config  (0) 2017.07.07
'Development/Java' 카테고리의 다른 글
  • [JAVA/OS] /dev/random 관련 PRNG 오류
  • [JAVA] 랜덤 퍼센트 계산하는 클래스(?)
  • [Spring Boot] Resource load 관련
  • [Spring Boot] Spring Security maximumSessions 관련
@곰팡
@곰팡
Java Backend Developer
  • @곰팡
    곰팡이 먼지연구소
    @곰팡
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • Daily Life (1)
        • 잡담 (1)
      • IT기업 입사 (0)
      • Development (52)
        • Java (24)
        • Spring (6)
        • Web (3)
        • OS (6)
        • Algorithm (4)
        • 이것저것 끄적끄적 (3)
        • Netty & FlatBuffers (3)
        • Database (2)
        • Dev-ops, Monitoring (1)
      • Labatory (0)
        • Test Bed 1 (0)
  • 블로그 메뉴

    • 메인
    • 카테고리
    • 태그
    • 방명록
    • 글 작성
    • 관리자
  • 링크

    • linkedIn
    • github
  • 공지사항

  • 인기 글

  • 태그

    해외여행
    Spring Boot
    kitakyusu
    자바
    고쿠라
    일본
    Spring
    prometheus
    皿倉山
    linux
    HashMap
    북큐슈
    北九州
    일본여행
    java
    flatbuffer
    고쿠라역
    springboot
    기타큐슈
    타코야끼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
@곰팡
[Spring boot] Websocket connect / disconnect 관련
상단으로

티스토리툴바