2015-02-16 19 views
8

Ho cercato un po 'e non sono stato in grado di trovarlo: esiste un modo in cui un server di stomp di primavera websocket può disconnettere un client basato sul sessionId (o realmente basato su qualcosa a tutti)?Disconnetti sessione client dal server stomp di Websocket di Spring

Mi sembra che una volta che un client si connette a un server non ci sia nulla che permetta al server di disconnettere il client.

risposta

1

Per quanto ne so l'API non fornisce ciò che si sta cercando, sul lato server è possibile rilevare solo eventi di disconnessione. Se si desidera disconnettere un determinato client, penso che sia necessario eseguire una soluzione alternativa, ad es. questo:

  1. Scrivi un JavaScript lato client funzione che è in grado di innescare una disconnessione
  2. Non appena il client è connesso al server, generare un ID cliente in Javascript e inviarlo al server . Ricorda l'ID sul client, ne avrai bisogno al punto (4).
  3. Nel momento in cui si desidera che il server disconnetta la connessione al client specifico (identificato dall'ID), inviare un messaggio contenente l'ID al client.
  4. Ora il tuo client javascript valuta il messaggio inviato dal server e decide di chiamare la funzione di disconnessione che hai scritto al punto (1).
  5. Il client si disconnette da solo.

La soluzione è un po 'macchinosa ma funzionerà.

+1

Purtroppo che assume il client è conforme con il messaggio di disconnessione. In definitiva, non voglio che il cliente abbia voce in capitolo. Marcare come risposta perché non sembra possibile. – user1751547

+1

In base al codice sorgente del metodo 'afterConnectionEstablished()' di SubProtocolWebSocketHandler.java', puoi leggere: '// WebSocketHandlerDecorator potrebbe chiudere la sessione' –

8

Effettivamente utilizzando alcuni accorgimenti, è possibile ottenere ciò che si desidera. Per che si dovrebbe fare:

  1. Usa configurazione java (non so se sia possibile con configurazione XML)
  2. estendere la vostra classe di configurazione da WebSocketMessageBrokerConfigurationSupport e attuare WebSocketMessageBrokerConfigurer interfaccia
  3. Crea sub personalizzato -protocollo websocket handler ed estenderlo da SubProtocolWebSocketHandler classe
  4. Nel proprio protocollo secondario websoc KET gestore di override afterConnectionEstablished metodo e si avrà accesso a WebSocketSession :) progetto di esempio primavera-boot

ho creato per mostrare come siamo in grado di disconnettere la sessione client dal lato server: https://github.com/isaranchuk/spring-websocket-disconnect

+0

Questa risposta dovrebbe essere accettata, funziona senza la collaborazione del cliente –

2

È può anche disconnettere la sessione mediante l'attuazione di una consuetudine 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(); 
    } 
} 
Problemi correlati