【问题标题】:How to detect that client has disconnected using websocket in spring mvc如何在spring mvc中使用websocket检测客户端已断开连接
【发布时间】:2018-08-28 06:28:45
【问题描述】:

我希望能够检测到用户何时失去与服务器的连接(关闭选项卡、失去互联网连接等)。我在客户端上使用 stompjs over 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();
    }
}

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

@RestController
@CrossOrigin
public class WebMessagingController {

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

我知道,如果我使用从 TextWebSocketHandler 扩展的类,我将让 bean 能够覆盖在客户端连接和断开连接时调用的方法,但我不这么认为将与 sock-js 客户端一起工作。 谢谢。

【问题讨论】:

    标签: spring-mvc spring-websocket sockjs stompjs


    【解决方案1】:

    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,并且所有信息都在事件中。

    【讨论】:

    • 嗯,有人知道在 Spring 5.0 之前怎么做吗?
    • 机器人确定你的问题是什么。 API 确实存在于某些4.x 版本中。所以,你在那里做的完全一样。如果某些东西不起作用,最好提出一个新的 SO 线程。不知何故,这方面的背景略有不同......
    • 我在 4.2.8 中没有看到它,但也许我错过了依赖或其他什么。
    • 你做错了什么。这确实是4.2.8 版本:github.com/spring-projects/spring-framework/blob/v4.2.8.RELEASE/…
    • 是的,它位于不同的库中,而不是基本 Web 依赖项的一部分。出于某种原因,Eclipse 不知道其他库,所以它似乎不存在。通常它会提供添加依赖项。
    【解决方案2】:

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

    @EventListener
    public void onDisconnectEvent(SessionDisconnectEvent event) {
        LOGGER.debug("Client with username {} disconnected", event.getUser());
    }
    

    【讨论】:

    • 你也是英雄!
    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 2022-01-03
    • 2020-01-15
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2010-11-15
    • 2015-11-21
    相关资源
    最近更新 更多