已解决 - 如何为 Spring 中的 WebSocket 升级请求自定义 HTTP 响应?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已解决 - 如何为 Spring 中的 WebSocket 升级请求自定义 HTTP 响应?相关的知识,希望对你有一定的参考价值。

我有一个WebSocket端点,在我的WebSocket端点中这样配置。WebSocketConfigurer 实施

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ExceptionWebSocketHandlerDecorator(myWebSocketHandler), "/ws/")
                .setAllowedOrigins("*")
                .addInterceptors(myHandshakeInterceptor);
    }

有一些检查 myWebSocketHandler#beforeHandshake 我想在服务器决定拒绝升级连接时向用户发送错误信息。我试过这样做

response.setStatusCode(HttpStatus.BAD_GATEWAY);
try {
    response.getBody().write("Error".getBytes());
    response.getBody().flush();
} catch (IOException e) {
    log.error("Error writing response", e);
}
return false;

状态码可以用,但正文是空的。怎么发啊?

EDIT:原来问题是我用Firefox控制台检查响应,它没有给我任何显示。如果我使用cURL进行同样的请求,那么一切都能正常工作,我看到了我写到响应体的消息!我有一个WebSocket端点。

答案

要更新响应体,你需要写你的自定义RequestUpateStrategy.As从spring官方文档中的AbstractHandshakeHandler说。

The actual upgrade is delegated to a server-specific RequestUpgradeStrategy, which will update the response as necessary and initialize the WebSocket.

如果你使用Tomcat作为servlet容器,你可以扩展 TomcatRequestUpgradeStrategy类并提供你自己的逻辑如何处理websocket升级。

对于每个servlet容器都有RequestUpgradeStrategy的实现。文件

以上是关于已解决 - 如何为 Spring 中的 WebSocket 升级请求自定义 HTTP 响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ZuulException 自定义 Spring Boot 控制器 API 响应

如何为 Spring Data 中的类配置 MongoDb 集合名称

如何为 Meteor 中的输入控件指示“已选中”或“已选择”状态(使用空格键模板)?

如何为 Spring Boot 启动器拆分库中的代码

Spring Boot - 如何为指定根目录中的多个路由提供一个静态 html 文件

如何为批量插入配置spring boot和data jpa