如何使用Spring 4捕获WebSocket服务器中的连接事件?

Ica*_*aro 4 java spring spring-mvc websocket

我按照这个https://github.com/rstoyanchev/spring-websocket-portfolio和这个 http://assets.spring.io/wp/WebSocketBlogPost进行了与Spring 4,STOMP和sock.js的简单Web套接字通信。 html

好吧,我想知道是否可能捕获连接事件,例如何时将新客户端连接到我的服务器或何时断开客户端的连接事件,在Spring 4.0.0中是否可能?

Ser*_*mar 8

当您从客户端收到消息时,Spring WebSocket会发布事件,如果您使用的是STOMP,则这些事件是已发布的:

检测连接和断开连接的最简单方法是为提到的事件实现事件侦听器。

public class WebSocketEventListener {

    @EventListener
    private void handleSessionConnected(SessionConnectEvent event) {
        ...
    }

    @EventListener
    private void handleSessionDisconnect(SessionDisconnectEvent event) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个跟踪连接用户的示例实现:https : //github.com/salmar/spring-websocket-chat/blob/master/src/main/java/com/sergialmar/wschat/event/PresenceEventListener.java


Ang*_*ity 7

这可以通过连接握手拦截器(HttpSessionHandshakeInterceptor)完成,引用文档

自定义初始 HTTP WebSocket 握手请求的最简单方法是通过 HandshakeInterceptor,它公开“之前”和“之后”握手方法。


wal*_*alv 6

据我了解,本主题未解决 DISCONNECT 事件的问题。握手拦截只为您提供连接信息,但不会断开连接。

我已经通过入站通道的拦截器实现了这一点:

<websocket:message-broker>
    ...
    <websocket:client-inbound-channel>
        <websocket:interceptors>
            <bean class="com......MyChannelInterception"></bean>
        </websocket:interceptors>
    </websocket:client-inbound-channel>
</websocket:message-broker>
Run Code Online (Sandbox Code Playgroud)

……还有课……

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;
}
}
Run Code Online (Sandbox Code Playgroud)

请注意 Principal 在 CONNECT 上可用,但在 DISCONNECT 上不可用,但是你有一个甜蜜的会话 ID