使用安全的Web套接字服务器(Tomcat)在Spring WebSocket(WSS)中与Angular SockJS(HTTPS)配合使用

17

我正在使用Spring WebSocket + Stomp + SockJS Client在服务器端向Angular客户端应用程序发送消息。

我的Socket服务器是一个Spring Boot应用程序,运行在8080端口。

它在ws/http协议上的工作正常,但现在我已经在Socket服务器上启用了SSL。

Socket服务器配置。

@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的Angular客户端的工作代码

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 Socket服务器的SSL,并在服务器和客户端端更新协议,例如 ws to wss 和 http to https

同时尝试以下操作以添加SSL Context。

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)安全地使用Web套接字 如何在Spring WebSocketClient中使用SSL? 请帮我摆脱困境。
谢谢 :)

2
有更新吗?我也遇到了同样的问题。 - Binakot
我正在寻找相同的解决方案?有更新吗? - Rohan J Mohite
你尝试过使用更新的JS-sock代码进行HTTPS连接吗? - Akhil Surapuram
@John,你在这里遇到了什么问题? - Akhil Surapuram
我有同样的问题 :/ 一旦我启用了SSL,客户端就无法连接到WebSocket。 - jjanczur
你的控制台有出现任何错误吗?请具体说明在连接时出现的错误。 - Amit Mishra
2个回答

1
我也遇到了相同的问题,后来发现我没有在安全配置文件中允许端点,只是在antMatchers中允许了websocket端点。

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

...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接