【问题标题】:How to deny WebSocket connections when no sub-protocol is specified未指定子协议时如何拒绝 WebSocket 连接
【发布时间】:2018-06-15 13:20:45
【问题描述】:

当客户端尝试建立 WebSocket 连接时,我试图只允许特定的子协议。

我的理解是我需要定义一个支持特定子协议的处理程序。

public class MyWebSocketHandler implements WebSocketHandler {
    private static final List<String> subProtocols = Collections.unmodifiableList(Arrays.asList(
        "MySubProtocol_v0",
        "MySubProtocol_v1"
    ));

    @Override
    public List<String> getSubProtocols() {
        return subProtocols;
    }

    @Override
    public Mono<Void> handle(WebSocketSession session) {
        return session.send(session.receive()
            .log((String) null, Level.INFO, true)
            .map(msg -> session.textMessage("Echo: " + msg.getPayloadAsText())));
    }
}

确实,当我尝试连接和协商任何指定的子协议时,它通过了:

15:11:11 command: /connect ws://localhost:8080/ingest MySubProtocol_v1
15:11:11 system:  Connecting to ws://localhost:8080/ingest
                  Accepted protocols: MySubProtocol_v1
15:11:12 system:  Connection established.
                  Selected protocol: MySubProtocol_v1

当我尝试连接和协商不受支持的协议时,连接未建立:

15:14:10 command: /connect ws://localhost:8080/ingest MySubProtocol_v2
15:14:10 system:  Connecting to ws://localhost:8080/ingest
                  Accepted protocols: MySubProtocol_v2
15:14:10 error:   WebSocket error.
15:14:10 system:  Connection closed.
Close status:     1006 (Abnormal Closure)

但是,当我不尝试协商子协议时,连接已建立。

15:17:23 command: /connect ws://localhost:8080/ingest
15:17:23 system:  Connecting to ws://localhost:8080/ingest
                  No protocol negotiation.
15:17:23 system:  Connection established.

我需要做什么来强制指定正确的子协议?

【问题讨论】:

    标签: java spring websocket protocols spring-websocket


    【解决方案1】:

    可以从HandshakeInfo对象:session.getHandshakeInfo()获取子协议信息。 HandshakeInfo 实例包含协商时使用的子协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2018-06-06
      • 1970-01-01
      • 2020-12-23
      • 2016-08-16
      相关资源
      最近更新 更多