복붙노트

[SPRING] 스프링 4와 함께 webSocket 서버에서 연결 이벤트를 캡처하는 방법은 무엇입니까?

SPRING

스프링 4와 함께 webSocket 서버에서 연결 이벤트를 캡처하는 방법은 무엇입니까?

나는이 https://github.com/rstoyanchev/spring-websocket-portfolio에 따라 spring 4, STOMP 및 sock.js와 간단한 웹 소켓 통신을 수행했으며이 http://assets.spring.io/wp/WebSocketBlogPost.html

글쎄, 새 클라이언트가 내 서버에 연결되었을 때 또는 클라이언트가 연결이 끊어졌을 때 가능한 캡처 연결 이벤트가 가능한지 알고 싶습니다. 스프링 4.0.0에서 가능합니까?

해결법

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

    1.이 작업은 문서를 인용하여 연결 핸드 셰이크 인터셉터 (HttpSessionHandshakeInterceptor)로 수행됩니다.

    이 작업은 문서를 인용하여 연결 핸드 셰이크 인터셉터 (HttpSessionHandshakeInterceptor)로 수행됩니다.

  2. ==============================

    2.Spring WebSocket은 클라이언트에서 메시지를받을 때 이벤트를 게시합니다. STOMP를 사용하는 경우 게시 된 이벤트는 다음과 같습니다.

    Spring WebSocket은 클라이언트에서 메시지를받을 때 이벤트를 게시합니다. STOMP를 사용하는 경우 게시 된 이벤트는 다음과 같습니다.

    연결 및 연결 끊김을 감지하는 가장 쉬운 방법은 언급 된 이벤트에 대한 이벤트 수신기를 구현하는 것입니다.

    public class WebSocketEventListener {
    
        @EventListener
        private void handleSessionConnected(SessionConnectEvent event) {
            ...
        }
    
        @EventListener
        private void handleSessionDisconnect(SessionDisconnectEvent event) {
            ...
        }
    }
    

    다음은 연결된 사용자를 추적하는 샘플 구현입니다. https://github.com/salmar/spring-websocket-chat/blob/master/src/main/java/com/sergialmar/wschat/event/PresenceEventListener.java

  3. ==============================

    3.이해하는 바와 같이,이 주제에서는 DISCONNECT 이벤트에 대한 질문이 해결되지 않습니다. 핸드 셰이크 차단은 정보 만 연결하고 연결은 끊지 않도록합니다.

    이해하는 바와 같이,이 주제에서는 DISCONNECT 이벤트에 대한 질문이 해결되지 않습니다. 핸드 셰이크 차단은 정보 만 연결하고 연결은 끊지 않도록합니다.

    나는 인바운드 채널의 인터셉터로 이것을 달성했다.

    <websocket:message-broker>
        ...
        <websocket:client-inbound-channel>
            <websocket:interceptors>
                <bean class="com......MyChannelInterception"></bean>
            </websocket:interceptors>
        </websocket:client-inbound-channel>
    </websocket:message-broker>
    

    ... 그리고 수업 ...

    import java.security.Principal;
    
    import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;
    import org.springframework.messaging.Message;
    import org.springframework.messaging.MessageChannel;
    import org.springframework.messaging.MessageHeaders;
    import org.springframework.messaging.simp.SimpMessageType;
    import org.springframework.messaging.support.ChannelInterceptorAdapter;
    
    public class MyChannelInterception extends ChannelInterceptorAdapter {
    
    private static final Logger LOGGER = LogManager.getLogger(WrcChannelInterception.class);
    
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
    
        MessageHeaders headers = message.getHeaders();
        SimpMessageType type = (SimpMessageType) headers.get("simpMessageType");
        String simpSessionId = (String) headers.get("simpSessionId");
    
        if (type == SimpMessageType.CONNECT) {
            Principal principal = (Principal) headers.get("simpUser");
            LOGGER.debug("WsSession " + simpSessionId + " is connected for user " + principal.getName());
        } else if (type == SimpMessageType.DISCONNECT) {
            LOGGER.debug("WsSession " + simpSessionId + " is disconnected");
        }
        return message;
    }
    }
    

    주체는 CONNECT에서는 사용할 수 있지만 DISCONNECT에서는 사용할 수 없지만 감미로운 세션 ID가 있음에 유의하십시오.

  4. from https://stackoverflow.com/questions/21781667/how-to-capture-connection-event-in-my-websocket-server-with-spring-4 by cc-by-sa and MIT license