J'ai cherché un peu et n'ai pas pu trouver ceci: Y a-t-il un moyen qu'un serveur de stomp de websocket de ressort puisse déconnecter un client basé sur le sessionId (ou vraiment basé sur n'importe quoi du tout)?
Il me semble qu'une fois qu'un client se connecte à un serveur, rien ne permet au serveur de déconnecter le client.
Autant que je sache, l'API ne fournit pas ce que vous recherchez, côté serveur, vous ne pouvez détecter que les événements de déconnexion. Si vous souhaitez déconnecter un certain client, je pense que vous devez opter pour une solution de contournement, par exemple. celui-là:
La solution de contournement est un peu lourde mais ça va marcher.
En fait, en utilisant certaines solutions de contournement, vous pouvez obtenir ce que vous voulez. Pour cela, vous devriez faire:
J'ai créé un exemple de projet Spring-Boot pour montrer comment nous pouvons déconnecter une session client côté serveur: https://github.com/isaranchuk/spring-websocket-disconnect
Vous pouvez également déconnecter une session en implémentant une WebSocketHandlerDecorator
personnalisée:
@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();
}
}
En cas de configuration XML, vous pouvez utiliser <websocket:decorator-factories>
dans le <websocket:transport>
de votre <websocket:message-broker>
. Créez les personnalités WebSocketHandlerDecorator
et WebSocketHandlerDecoratorFactory
qui implémentent la méthode decorate
.