2015-02-16 8 views
8

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

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

ответ

1

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

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

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

+1

К сожалению, это предполагает, что клиент соответствует сообщению разъединения. В конечном счете, я не хочу, чтобы у клиента было слово. Маркировка как ответ, потому что это не кажется возможным. – user1751547

+1

В соответствии с исходным кодом метода 'afterConnectionEstablished()' SubProtocolWebSocketHandler.java, вы можете читать: '// WebSocketHandlerDecorator может закрыть сеанс' –

8

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

  1. Использовать конфигурацию Java (не уверен, если это возможно с XML-конфигурации)
  2. Расширьте класс конфигурации из WebSocketMessageBrokerConfigurationSupport и реализовать WebSocketMessageBrokerConfigurer интерфейс
  3. Создание пользовательских суб -protocol websocket и расширять его от SubProtocolWebSocketHandler класс
  4. В вашем пользовательском суб-протоколе websoc кет обработчик переопределение afterConnectionEstablished метод, и вы будете иметь доступ к WebSocketSession :)

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

+0

Этот ответ должен быть принят, он работает без сотрудничества с клиентом –

2

You может также отключить сеанс, выполнив заказ 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(); 
    } 
} 
Смежные вопросы