如何在 spring mvc 中使用 websocket 检测客户端已断开连接
How to detect that client has disconnected using websocket in spring mvc
我希望能够检测到用户何时与服务器失去连接(关闭选项卡、失去互联网连接等)我在我的客户端上使用 stompjs 而不是 Sockjs,spring mvc websockets我的服务器。
我如何检测客户端何时断开连接。
以下是我如何配置我的 websocket 消息 brocket:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
private TaskScheduler scheduler;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic").setHeartbeatValue(new long[]{10000, 10000}).setTaskScheduler(scheduler);
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/web").setAllowedOrigins("*").withSockJS();
}
}
这是我的控制器 class,它实际处理传入的套接字消息:
@RestController
@CrossOrigin
public class WebMessagingController {
@MessageMapping("/chat/message")
public void newUserMessage(String json) throws IOException {
messagesProcessor.processUserMessage(json);
}
}
我知道,如果我使用从 TextWebSocketHandler 扩展的 class,我将能够覆盖在连接和断开连接时调用的方法客户端,但我认为这不适用于 sock-js 客户端。
谢谢。
StompSubProtocolHandler
实现从 WebSocketHandler.afterConnectionClosed()
调用的 afterSessionEnded()
。前者发出这样的事件:
/**
* Event raised when the session of a WebSocket client using a Simple Messaging
* Protocol (e.g. STOMP) as the WebSocket sub-protocol is closed.
*
* <p>Note that this event may be raised more than once for a single session and
* therefore event consumers should be idempotent and ignore a duplicate event.
*
* @author Rossen Stoyanchev
* @since 4.0.3
*/
@SuppressWarnings("serial")
public class SessionDisconnectEvent extends AbstractSubProtocolEvent {
所以,您需要的是一个 ApplicationListener
这个 SessionDisconnectEvent
,所有信息都在活动中。
除了Artem的响应,你可以在任何spring bean:
中使用@EventListener注解
@EventListener
public void onDisconnectEvent(SessionDisconnectEvent event) {
LOGGER.debug("Client with username {} disconnected", event.getUser());
}
我希望能够检测到用户何时与服务器失去连接(关闭选项卡、失去互联网连接等)我在我的客户端上使用 stompjs 而不是 Sockjs,spring mvc websockets我的服务器。
我如何检测客户端何时断开连接。 以下是我如何配置我的 websocket 消息 brocket:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
private TaskScheduler scheduler;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic").setHeartbeatValue(new long[]{10000, 10000}).setTaskScheduler(scheduler);
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/web").setAllowedOrigins("*").withSockJS();
}
}
这是我的控制器 class,它实际处理传入的套接字消息:
@RestController
@CrossOrigin
public class WebMessagingController {
@MessageMapping("/chat/message")
public void newUserMessage(String json) throws IOException {
messagesProcessor.processUserMessage(json);
}
}
我知道,如果我使用从 TextWebSocketHandler 扩展的 class,我将能够覆盖在连接和断开连接时调用的方法客户端,但我认为这不适用于 sock-js 客户端。 谢谢。
StompSubProtocolHandler
实现从 WebSocketHandler.afterConnectionClosed()
调用的 afterSessionEnded()
。前者发出这样的事件:
/**
* Event raised when the session of a WebSocket client using a Simple Messaging
* Protocol (e.g. STOMP) as the WebSocket sub-protocol is closed.
*
* <p>Note that this event may be raised more than once for a single session and
* therefore event consumers should be idempotent and ignore a duplicate event.
*
* @author Rossen Stoyanchev
* @since 4.0.3
*/
@SuppressWarnings("serial")
public class SessionDisconnectEvent extends AbstractSubProtocolEvent {
所以,您需要的是一个 ApplicationListener
这个 SessionDisconnectEvent
,所有信息都在活动中。
除了Artem的响应,你可以在任何spring bean:
中使用@EventListener注解@EventListener
public void onDisconnectEvent(SessionDisconnectEvent event) {
LOGGER.debug("Client with username {} disconnected", event.getUser());
}