Spring websocket (WSS) с angular sockjs (HTTPS) через безопасный сервер веб-сокетов (tomcat)

Я работаю над отправкой сообщений со стороны сервера в клиентское приложение angular, используя веб-сокет Spring + stomp + SockJsClient на стороне сервера и SockJS на стороне angular.

Мой сервер Socket - это приложение с весенней загрузкой, работающее на порту 8080.

Он отлично работает по протоколу ws/http. но теперь я включил SSL на сервере сокетов.

Конфигурация сокет-сервера.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/topic");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/sync").setAllowedOrigins("*").withSockJS();
}}

Рабочий код клиента Java через WS

List<Transport> transports = new ArrayList<Transport>(1);
transports.add(new RestTemplateXhrTransport());
SockJsClient sockJsClient = new SockJsClient(transports);
sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());

WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new StringMessageConverter());
String url = "ws://my-socket.server.com/sync";
StompSessionHandler sessionHandler = new MyStompSessionHandler(senderId, syncUrl, content);
stompClient.connect(url, sessionHandler);

Рабочий код углового клиента через HTTP

const Stomp = StompJs.Stomp;
const socket = new SockJS('http://my-socket.server.com/sync');
this.stompClient = Stomp.over(socket);
this.stompClient.connect({}, (res, err) => {}

Теперь я реализовал SSL через свой сервер веб-сокетов, который работает на отдельном загрузочном сервере spring. И обновить протокол на стороне сервера и клиента, как. ws на wss и http на https.

А также попробуйте следующие вещи, чтобы добавить контекст SSL

StandardWebSocketClient simpleWebSocketClient = new StandardWebSocketClient();
List<Transport> transports = new ArrayList<Transport>(1);
Map<String, Object> userProperties = new HashMap<String, Object>();
userProperties.put("org.apache.tomcat.websocket.SSL_CONTEXT", SSLContext.getDefault());
simpleWebSocketClient.setUserProperties(userProperties);
transports.add(new WebSocketTransport(simpleWebSocketClient));

У меня есть ссылка на следующую ссылку стека, но не повезло :(

Защищенный веб-сокет с HTTPS (SSL)

Как использовать Spring WebSocketClient с SSL?

Пожалуйста, помогите мне выбраться из него.

Спасибо :)


person John Martin    schedule 19.06.2019    source источник
comment
Любые обновления? Есть такая же проблема.   -  person Binakot    schedule 24.09.2019
comment
Я ищу такое же решение? любые обновления?   -  person Rohan J Mohite    schedule 24.09.2019
comment
Вы пробовали с обновленным кодом js - sock https one?   -  person Akhil Surapuram    schedule 30.05.2020
comment
@Джон, с какой проблемой ты здесь столкнулся?   -  person Akhil Surapuram    schedule 30.05.2020
comment
У меня та же проблема: / Как только я включил SSL, я не могу подключиться к WebSocket с клиента   -  person jjanczur    schedule 28.04.2021
comment
Вы получаете какую-либо ошибку на консоли? Пожалуйста, укажите конкретную ошибку, которую вы получаете при подключении.   -  person Amit Mishra    schedule 05.07.2021


Ответы (1)


ПРОХОДИМ ту же проблему, сначала удаляем с SockJS вроде

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfigurer implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/");
        config.setApplicationDestinationPrefixes("/js");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/").setAllowedOrigins("*");
    }
}

наш интерфейс находится в VUE, но соединение все еще такое же, как в JS.

    WEB_SOCKET_URL_PREFIX: 'ws://localhost:8080/'

    connect(resolve) {
        const URL = '/somePath';
        this.webSocket = new WebSocket(HttpConfig.WEB_SOCKET_URL_PREFIX);
        this.stompClient = Stomp.over(this.webSocket, { debug: false });

        this.stompClient.connect({}, () => {
            this.stompClient.subscribe(URL, data => {
                console.log(data);
            });
        });
    }

и в вашем Java-коде вы можете отправить модификацию с помощью


    private final SimpMessagingTemplate simpMessagingTemplate;

public void someMethod(){

...
 simpMessagingTemplate.convertAndSend("/somePath", "someContent");

...
}
person Lucas Costa    schedule 30.06.2021