通过安全Web套接字服务器(tomcat)上的带有角度sockjs(HTTPS)的Spring Websocket(WSS)

时间:2019-06-19 07:48:46

标签: spring-boot ssl spring-websocket stomp sockjs

我正在使用服务器端的Spring Web socket + stomp + SockJsClient和角度端的SockJS将消息从服​​务器端发送到角度客户端应用程序。

我的Socket服务器是一个Spring Boot应用程序,运行在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();
}}

通过WS的Java客户端的工作代码

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) => {}

现在,我已经在运行在单独的Spring Boot服务器上的Web套接字服务器上实现了SSL。并在服务器和客户端更新协议。 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));

我从以下堆栈链接中获取了参考,但没有运气:(

Secure websocket with HTTPS (SSL)

How to use Spring WebSocketClient with SSL?

请帮助我摆脱困境。

谢谢:)

1 个答案:

答案 0 :(得分:0)

我们通过同样的问题,先把withSockJS之类的去掉

@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");

...
}