Я новичок ie для веб-сокетов. Сейчас я тренируюсь и сталкиваюсь с некоторыми проблемами:
1) Когда клиент подключается к сокету, получает сообщение, подобное этому:
CONNECTED
server:RabbitMQ/3.8.2
session:session-yy0DydqMa2I9H355EhfpPw
heart-beat:10000,10000
version:1.1
user-name:11111111111
Ответное сообщение содержит информацию о сервере. Я думал, что это сообщение специально для RabbitMQ, но это не так, я пытался с ActiveMQ Artemis, результат тот же. Это сообщение написано в классе WebSocketServerSockJsSession
(как и любые другие сообщения). Я не могу понять, как предотвратить отправку информации о сервере. Это проблема безопасности? Как отключить отправку информации о сервере?
2) Если клиент отправляет параметр auto-delete
в заголовке, очередь создается как недолговечная, то есть клиенты могут изменять настройки очереди. Это нормально, что клиенты браузера имеют такое разрешение? Как я могу предотвратить это?
$(function () {
var csrf = $("meta[name='_csrf']").attr("content");
var socket = new SockJS('/ws');
var stompClient = Stomp.over(socket);
stompClient.connect({'X-CSRF-TOKEN': csrf}, function (frame) {
stompClient.subscribe('/user/queue/error', function (data) {
console.log(data);
},{'auto-delete' : true});
});
});
3) Я полагаю, что Spring создает очереди как долговечные (я не уверен, просто догадываюсь). Как я могу гарантировать, что созданные очереди недолговечны (я не хочу, чтобы клиенты браузера принимали это решение)? В приведенном ниже примере создается долговременная очередь для каждого пользователя:
@MessageExceptionHandler
@SendToUser("/queue/error")
public String handleException(Exception ex) {
return ex.getMessage();
}
Вот моя конфигурация для Spring (я не настраивал в RabbitMQ):
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<Session> {
@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/queue/", "/topic/")
.setUserDestinationBroadcast("/topic/unresolved-user-destination")
.setUserRegistryBroadcast("/topic/user-registry")
.setRelayHost("localhost")
.setRelayPort(61613)
.setSystemLogin("guest")
.setSystemPasscode("guest")
.setClientLogin("client")
.setClientPasscode("123");
registry.setApplicationDestinationPrefixes("/ws-app");
}
}
@Configuration
class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages.simpSubscribeDestMatchers("/topic/**").permitAll()
.simpSubscribeDestMatchers("/user/**", "/queue/**").hasRole("USER")
.simpDestMatchers("/ws-app/send").hasRole("USER");
}
}
Environment
- Spring Boot 2.2.4
- RabbitMQ 3.8.2 с плагином STOMP