如何自定义 websocket 握手和/或添加过滤器?
Posted
技术标签:
【中文标题】如何自定义 websocket 握手和/或添加过滤器?【英文标题】:How to customize websocket handshake and/or add a filter? 【发布时间】:2019-02-21 12:39:50 【问题描述】:我需要以某种方式验证 websocket 请求。
有没有办法使用带有 reactor-netty 的 spring webflux 来实现?
spring-boot 2.0.5.Release reactor-netty 0.7.9.Release【问题讨论】:
【参考方案1】:这些版本包含使用 websocket 自定义某些东西的有限可能性。 我发现的唯一方法是扩展 HandshakeWebSoketService:
public class CustomHandshakeWebSocketService extends HandshakeWebSocketService
public CustomHandshakeWebSocketService(
RequestUpgradeStrategy upgradeStrategy
)
super(upgradeStrategy);
@Override
public Mono<Void> handleRequest(
ServerWebExchange exchange,
WebSocketHandler handler
)
ServerHttpRequest request = exchange.getRequest();
if ( //do some validation and if valid delegate to chain)
return super.handleRequest(exchange, handler);
// If not valid, return error
return Mono
.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid request"));
然后我们必须注册那个自定义服务:
@Bean
public WebSocketHandlerAdapter handlerAdapter()
return new WebSocketHandlerAdapter(webSocketService());
@Bean
public WebSocketService webSocketService()
ReactorNettyRequestUpgradeStrategy strategy = new ReactorNettyRequestUpgradeStrategy();
return new CustomHandshakeWebSocketService(strategy);
【讨论】:
以上是关于如何自定义 websocket 握手和/或添加过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
WebSockets Tutorial(教程一)————WebSockets简介
探讨Netty获取并检查Websocket握手请求的两种方式
如何编写自己的 TCP/IP 或 ISO/OSI 堆栈以使用 WebSockets 而无需每次都使用握手?
websocket的握手源代码中的laddr和raddr是啥
WireShark如何抓包,各种协议(HTTPARPICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手