当客户端试图建立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:
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:
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:
No protocol negotiation.
15:17:23 system: Connection established.
我需要做什么来强制指定正确的子协议?