JSR-356:如何在握手期间中止websocket连接?

Cél*_*lio 10 java java-ee websocket java-7 java-ee-7

我需要能够在握手期间中止websocket连接,以防HTTP请求不符合某些条件.根据我的理解,正确的地方是我自己实现的ServerEndpointConfig.Configurator.modifyHandshake()方法Configurator.我只是无法弄清楚要做什么来中止连接.有一个HandshakeResponse参数,允许向响应添加标题但我找不到任何执行该工作的标题.

那么如何在握手期间中止websocket连接呢?这甚至可能吗?

Leo*_*Leo 4

你是对的,使用 \xc2\xb4modifyHandShake()\xc2\xb4 来更新响应标头,您需要准确删除或设置标头的值Sec-WebSocket-Accept,请从规范中检查这一点

\n
\n

|Sec-WebSocket-Accept| 标头字段指示服务器是否愿意接受连接。如果存在,此标头字段必须包含在\n|Sec-WebSocket-Key| 中发送的客户端随机数的哈希值 以及预定义的 GUID。任何其他值\n不得被解释为服务器\n接受连接。

\n
\n
    HTTP/1.1 101 Switching Protocols\n    Upgrade: websocket\n    Connection: Upgrade\n    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\n
Run Code Online (Sandbox Code Playgroud)\n
\n

这些字段由 WebSocket 客户端检查脚本页面。\n如果 |Sec-WebSocket-Accept| 值与\n预期值不匹配,如果标头字段缺失,或者 HTTP 状态代码\n不是 101,则将无法建立连接,并且不会发送 WebSocket 帧。\n

\n
\n

你的代码看起来像这样:

\n
 @Override\npublic void modifyHandshake(ServerEndpointConfig sec,\n    HandshakeRequest request, HandshakeResponse response) {\n    super.modifyHandshake(sec, request, response);\n    response.getHeaders().put(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, new ArrayList<String>());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

浏览器会将此解释为服务器未接受连接。例如在 chrome 中我收到消息

\n
\n

Websocket握手时出错

\n
\n

  • 嗨@Leo,我之前已经尝试过这种方法,但它不起作用(至少在 Tomcat 上)。在我看来,服务器代码在调用“modifyHandshake()”后设置了“Sec-WebSocket-Accept”标头。当在 `modifyHandshake()` 中打印响应头时,如下所示: `logger.info("response.getHeaders() =&gt; " + response.getHeaders());` 我们得到: `response.getHeaders() =&gt; { }` (2认同)