spring-boot - Spring websocket (WSS) 与 angular sockjs (HTTPS) 在安全 web socket 服务器 (tomcat) 上

标签 spring-boot ssl spring-websocket stomp sockjs

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

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

它在 ws/http 协议(protocol)上运行良好。但现在我已经在套接字服务器上启用了 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 上 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) => {}

现在我已经在我的 web 套接字服务器上实现了 SSL,该服务器在单独的 spring boot 服务器上运行。并在服务器和客户端更新协议(protocol),如。 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?

请帮我摆脱它。

谢谢 :)

最佳答案

我们遇到同样的问题,先去掉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");

...
}

关于spring-boot - Spring websocket (WSS) 与 angular sockjs (HTTPS) 在安全 web socket 服务器 (tomcat) 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56662596/

相关文章:

spring - 如何将 Spring Hatoas ControllerLinkBuilder 用于 Thymeleaf 模板化的预定电子邮件

mysql - 为什么在添加列时所有行都获得空值?

Spring Websocket 配置 : using WebSocketMessageBrokerConfigurationSupport and WebSocketConfigurer together - how?

session - 使用 Websockets 时无法在 Spring Controller 中获取 Session

java - 除非明确指定,否则如何默认将 Spring Data JPA 从 camelCase 命名为 snake_case?

java - 为什么我的 spring boot 错误 Controller 不工作?

c++ - 我是 RUBY 的新手,我需要了解 3 个函数

java - @MessageMapping 返回上的 STOMP header

java - 使用 SSLEngine 使用为内部网络位置签名的证书

ssl - gitlab-runner 的 git clone 失败,出现 "Problem with the SSL CA cert (path? access rights?)"