SockJS 和 Webstomp 的协议兼容性问题

mtn*_*tnp 6 spring websocket sockjs web-stomp

我正在使用 Spring Boot 和 Angular 构建网络聊天。为此,我将 Websockets 与客户端 SockJS 和 Webstomp 以及服务器端 Spring 结合使用。

问题是我在运行时在控制台上收到此错误:

弃用:未定义不是公认的 STOMP 版本。在下一个主要客户端版本中,这将关闭连接。

我在 google 上查了一下,在 github stomp 项目上找到了这个线程:https : //github.com/JSteunou/webstomp-client/issues/75

这是与 SockJS 和 Webstomp 的协议兼容性问题。

所以,我在下面的代码中添加了options参数(即使协议参数不允许用于 over 方法?)

    var socket = new SockJS("http://localhost:8086/ws");
    var options = {debug: false, protocols: webstomp.VERSIONS.supportedProtocols()};
    var stompClient = webstomp.over(socket, options);
Run Code Online (Sandbox Code Playgroud)

并且错误信息消失了。但是在请求标头中仍然没有标头 Sec-Websocket-Procotol 来定义使用哪个协议,我想我将来会遇到问题。

我该怎么做才能使我的代码正常工作?

客户端(角度)

  connectWebSocketRoom() {
    var socket = new SockJS("http://localhost:8086/ws");
    var options = {debug: false, protocols: webstomp.VERSIONS.supportedProtocols()};
    var stompClient = webstomp.over(socket, options);
    // var stompClient2 = webstomp.client(socket, ['v10.stomp', 'v11.stomp', 'v12.stomp']);

    stompClient.connect({}, function(frame) {
      console.log("test disconnect");
      stompClient.disconnect();
    });
  }
Run Code Online (Sandbox Code Playgroud)

服务端(Spring)

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/rooms"); 
        config.enableSimpleBroker("/topic", "/queue"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

请求和响应的标题:

要求

Host: localhost:8086
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: */*
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://localhost:4200
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: SjoHYGkjTrPsDan0XmfgNg==
Connection: keep-alive, Upgrade
Cookie: access_token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwaWVycmhvIiwicm9sZXMiOlsiUk9MRV9BRE1JTiIsIldSSVRFX0FDQ0VTUyIsIkRFTEVURV9BQ0NFU1MiLCJSRUFEX0FDQ0VTUyJdLCJpYXQiOjE1NjgxMjg1NzUsImV4cCI6MTU2ODEyODg3NX0.a4BNKm9qLbpEZFeMaI9seXSICWys3Exrumk9WyOqp6A
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Run Code Online (Sandbox Code Playgroud)

回复

HTTP/1.1 101 
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: http://localhost:4200
Access-Control-Allow-Credentials: true
Set-Cookie: access_token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwaWVycmhvIiwicm9sZXMiOlsiUk9MRV9BRE1JTiIsIlJFQURfQUNDRVNTIiwiV1JJVEVfQUNDRVNTIiwiREVMRVRFX0FDQ0VTUyJdLCJpYXQiOjE1NjgxMjg1NzYsImV4cCI6MTU2ODEyODg3Nn0.lD9wrYkztqWnihIqJodr3EpjMcMfBVUmbhxetBaGX5A; Max-Age=86400; Expires=Wed, 11-Sep-2019 15:16:16 GMT; Path=/; HttpOnly
Set-Cookie: access_token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwaWVycmhvIiwicm9sZXMiOlsiUk9MRV9BRE1JTiIsIlJFQURfQUNDRVNTIiwiV1JJVEVfQUNDRVNTIiwiREVMRVRFX0FDQ0VTUyJdLCJpYXQiOjE1NjgxMjg1NzYsImV4cCI6MTU2ODEyODg3Nn0.lD9wrYkztqWnihIqJodr3EpjMcMfBVUmbhxetBaGX5A; Max-Age=86400; Expires=Wed, 11-Sep-2019 15:16:16 GMT; Path=/; HttpOnly
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: 9fahUc0KPDJ8vAUF2In5zZCGQTM=
Sec-WebSocket-Extensions: permessage-deflate
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Date: Tue, 10 Sep 2019 15:16:15 GMT
Run Code Online (Sandbox Code Playgroud)

控制台屏幕: 错误协议