是否可以使用 WebSocket 握手发送自定义数据?

Is it possible to send custom data with WebSocket handshake?

假设我有自己的基于 Java Chromium Embedded Framework (JCEF) 的自定义 Web 浏览器,它在内部运行 WebSocket 服务器。

现在我的网络应用程序 运行 在我的 CustomWebBrowser 上,可以使用 websockets 连接到内部 WebSocket 服务器。

但是,我不希望任何其他 websocket 客户端(使用 websockets 的其他浏览器或桌面应用程序)连接到我的内部 WebSocket 服务器。

其中一种方法是执行以下步骤:

  1. 让 CustomWebBrowser 生成一个秘密并使用 Java-JavaScript bridge 将该秘密从 JCEF 发送到 Web 应用程序。
  2. Web 应用程序将在握手期间将该机密发送到内部 WebSocket 服务器,如下所示:

    var ws = new WebSocket(myURL, protocols, mySecret);

  3. 内部WebSocket服务器可以与在步骤1中生成并发送秘密的CustomBrowser验证秘密。

  4. 如果秘密被验证则握手成功完成,否则websocket连接被拒绝。

我的问题是:是否可以在 websocket 握手期间发送任何自定义数据?

是的,WebSocket handshake 使用普通的 HTTP request/response,您可以向其中添加包含自定义信息的任意 headers。

WebSocket client/server 的库可能不允许这样做;但在从客户端发起连接时,您始终可以在 urlprotocol 中嵌入信息。