代码之家  ›  专栏  ›  技术社区  ›  ioreskovic

如何在未指定子协议时拒绝WebSocket连接

  •  1
  • ioreskovic  · 技术社区  · 6 年前

    当客户端试图建立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.
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Marcin Bukowiecki    6 年前

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