Отключите сеанс клиента от сервера Spring websocket stomp

Я искал совсем немного и не смог найти это: есть ли способ, которым сервер spring websocket stomp может отключить клиент на основе sessionId (или действительно на основе чего-либо вообще)?

Мне кажется, что как только клиент подключается к серверу, нет ничего, что позволяет серверу отключить клиента.

4 ответов


насколько я знаю, API не предоставляет то, что вы ищете, на стороне сервера вы можете только обнаружить события разъединения. Если вы хотите отключить определенного клиента, я думаю, вы должны пойти на небольшое обходное решение, например, это:

  1. напишите клиентскую функцию javascript, которая может вызвать отключение
  2. как только ваш клиент подключен к серверу, создайте идентификатор клиента в javascript и отправьте его на сервер. Запомните ID на клиент, вам понадобится на шаге (4).
  3. в то время, когда вы хотите, чтобы сервер отключил соединение с конкретным клиентом (идентифицированным идентификатором), отправьте клиенту сообщение, содержащее идентификатор.
  4. Теперь ваш клиент javascript оценивает сообщение, отправленное с сервера, и решает вызвать функцию disconnect, которую вы написали на шаге (1).
  5. ваш клиент отключается.

обходной путь немного громоздок, но он будет работа.


на самом деле, используя некоторые обходные пути, вы можете достичь того, чего вы хотите. Для этого вы должны сделать:

  1. используйте конфигурацию java (не уверен, что это возможно с конфигурацией XML)
  2. Расширьте свой класс конфигурации из WebSocketMessageBrokerConfigurationsupport и реализовать WebSocketMessageBrokerConfigurer интерфейс
  3. создать пользовательский обработчик суб-протокола websocket и расширить его из SubProtocolWebSocketHandler класс!--4-->
  4. в вашем пользовательском суб-протоколе WebSocket handler override afterConnectionEstablished метод и у вас будет доступ к WebSocketSession:)

Я создал пример проекта spring-boot, чтобы показать, как мы можем отключить сеанс клиента со стороны сервера: https://github.com/isaranchuk/spring-websocket-disconnect


вы также можете отключить сеанс, реализовав пользовательский WebSocketHandlerDecorator:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig<S extends ExpiringSession> extends AbstractSessionWebSocketMessageBrokerConfigurer<S> {

    @Override
    public void configureWebSocketTransport(final WebSocketTransportRegistration registration) {
        registration.addDecoratorFactory(new WebSocketHandlerDecoratorFactory() {
            @Override
            public WebSocketHandler decorate(final WebSocketHandler handler) {
                return new WebSocketHandlerDecorator(handler) {
                    @Override
                    public void afterConnectionEstablished(final WebSocketSession session) throws Exception {

                        session.close(CloseStatus.NOT_ACCEPTABLE);
                        super.afterConnectionEstablished(session);
                    }
                };
            }
        });
        super.configureWebSocketTransport(registration);
    }


    @Override
    protected void configureStompEndpoints(final StompEndpointRegistry registry) {
    registry.addEndpoint("/home")
            .setHandshakeHandler(new DefaultHandshakeHandler(
                    new UndertowRequestUpgradeStrategy() // If you use undertow
                    // new JettyRequestUpgradeStrategy()
                    // new TomcatRequestUpgradeStrategy()
            ))
            .withSockJS();
    }
}

в случае конфигурации XML, вы можете использовать <websocket:decorator-factories> на <websocket:transport> вашего <websocket:message-broker>. Создать пользовательский WebSocketHandlerDecorator и WebSocketHandlerDecoratorFactory реализации decorate метод.