簡體   English   中英

如何使用 Spring 4 在我的 webSocket 服務器中捕獲連接事件?

[英]how to capture connection event in my webSocket server with Spring 4?

我用 spring 4,STOMP 和 sock.js 做了一個簡單的 web 套接字通信,遵循這個https://github.com/rstoyanchev/spring-websocket-portfolio和這個http://assets.spring.io/ html

好吧,我想知道是否有可能捕獲連接事件,例如當新客戶端連接到我的服務器時或當客戶端斷開連接時,這在 Spring 4.0.0 中是否可能?

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

這是一個連接握手攔截器( HttpSessionHandshakeInterceptor ),引用文檔

自定義初始HTTP WebSocket握手請求的最簡單方法是通過HandshakeInterceptor,它暴露握手方法的“之前”和“之后”。

據我了解,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;
}
}

請注意,Principal可以在CONNECT上使用,但不能在DISCONNECT上使用,但是你有甜蜜的會話ID

雖然最初的問題是關於 Spring 4 - Sergi 很好地回答了這個問題。 這是在 Spring 5 或 Spring Boot 2 中執行此操作的方法(在引擎蓋下使用 Spring 5)。 需要實現ApplicationListener:

@Component
public class WebSocketEventListener implements ApplicationListener<SessionConnectEvent> {
    Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);

    @Override
    public void onApplicationEvent(SessionConnectEvent event) {
        logger.error("SessionConnectEvent = " + event);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM