[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.이 작업은 문서를 인용하여 연결 핸드 셰이크 인터셉터 (HttpSessionHandshakeInterceptor)로 수행됩니다.
이 작업은 문서를 인용하여 연결 핸드 셰이크 인터셉터 (HttpSessionHandshakeInterceptor)로 수행됩니다.
-
==============================
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.이해하는 바와 같이,이 주제에서는 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가 있음에 유의하십시오.
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
'SPRING' 카테고리의 다른 글
[SPRING] Spring 5 - 정적 자원을 제공하는 방법 (0) | 2019.07.17 |
---|---|
[SPRING] Spring 데이터 수신 REST URL에서 작동하지 않는 Spring 인터셉터 (0) | 2019.07.17 |
[SPRING] 3.2와 4.2 사이의 Redis Session Serializer 불일치 (0) | 2019.07.17 |
[SPRING] Spring Boot에서 MappingJackson2HttpMessageConverter를 확장하여 사용자 정의 변환기를 추가하면 기존 변환기를 덮어 쓰는 것처럼 보입니다. (0) | 2019.07.17 |
[SPRING] 스프링 부트 LDAP 사용자 정의 UserDetails (0) | 2019.07.17 |