如何自定义websocket握手和/或添加过滤器?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何自定义websocket握手和/或添加过滤器?相关的知识,希望对你有一定的参考价值。
我需要以某种方式验证websocket请求。
有没有办法使用带有reactor-netty的spring webflux来实现这个目标?
- spring-boot 2.0.5。发布
- reactor-netty 0.7.9。发布
答案
这些版本包含使用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 而无需每次都使用握手?