3

我希望能够检测到用户何时失去与服务器的连接(关闭选项卡、失去互联网连接等)。我在客户端上使用 stompjs over Sockjs 并在服务器上使用 spring mvc websockets。

我如何检测客户端何时失去连接。这是我配置我的 websocket 消息分组的方式:

@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();
    }
}

这是我的控制器类,它实际上处理传入的套接字消息:

@RestController
@CrossOrigin
public class WebMessagingController {

    @MessageMapping("/chat/message")
    public void newUserMessage(String json) throws IOException {
        messagesProcessor.processUserMessage(json);
    }
}

我知道,如果我使用从TextWebSocketHandler扩展的类,我将拥有能够覆盖在客户端连接和断开连接时调用的方法的 bean,但我认为这不适用于 sock-js 客户端。谢谢你。

4

2 回答 2

8

除了 Artem 的响应之外,您还可以在任何spring bean中使用 @EventListener 注解:

@EventListener
public void onDisconnectEvent(SessionDisconnectEvent event) {
    LOGGER.debug("Client with username {} disconnected", event.getUser());
}
于 2018-03-28T11:15:43.657 回答
4

从. _ StompSubProtocolHandler_ 前者会发出这样的事件:afterSessionEnded()WebSocketHandler.afterConnectionClosed()

/**
 * 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 {

因此,您需要的是一个ApplicationListenerSessionDisconnectEvent并且所有信息都在事件中。

于 2018-03-19T16:07:30.707 回答