如何使用Spring 4在我的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中进行?

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

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

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

我用入站通道的拦截器实现了这个目的:

 ...       

……和class级……

 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 WebSocket在从客户端收到消息时发布事件,如果您使用的是STOMP,则这些是发布的事件:

  • SessionConnectedEvent
  • SessionConnectEvent
  • SessionDisconnectEvent
  • SessionSubscribeEvent
  • SessionUnsubscribeEvent

检测连接和断开连接的最简单方法是为上述事件实现事件监听器。

 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