Отключите сеанс клиента от сервера Spring websocket stomp
Я искал совсем немного и не смог найти это: есть ли способ, которым сервер spring websocket stomp может отключить клиент на основе sessionId (или действительно на основе чего-либо вообще)?
Мне кажется, что как только клиент подключается к серверу, нет ничего, что позволяет серверу отключить клиента.
4 ответов
насколько я знаю, API не предоставляет то, что вы ищете, на стороне сервера вы можете только обнаружить события разъединения. Если вы хотите отключить определенного клиента, я думаю, вы должны пойти на небольшое обходное решение, например, это:
- напишите клиентскую функцию javascript, которая может вызвать отключение
- как только ваш клиент подключен к серверу, создайте идентификатор клиента в javascript и отправьте его на сервер. Запомните ID на клиент, вам понадобится на шаге (4).
- в то время, когда вы хотите, чтобы сервер отключил соединение с конкретным клиентом (идентифицированным идентификатором), отправьте клиенту сообщение, содержащее идентификатор.
- Теперь ваш клиент javascript оценивает сообщение, отправленное с сервера, и решает вызвать функцию disconnect, которую вы написали на шаге (1).
- ваш клиент отключается.
обходной путь немного громоздок, но он будет работа.
на самом деле, используя некоторые обходные пути, вы можете достичь того, чего вы хотите. Для этого вы должны сделать:
- используйте конфигурацию java (не уверен, что это возможно с конфигурацией XML)
- Расширьте свой класс конфигурации из WebSocketMessageBrokerConfigurationsupport и реализовать WebSocketMessageBrokerConfigurer интерфейс
- создать пользовательский обработчик суб-протокола websocket и расширить его из SubProtocolWebSocketHandler класс!--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
метод.