如何自定义 websocket 握手 and/or 添加过滤器?
How to customize websocket handshake and/or add a filter?
我需要以某种方式验证 websocket 请求。
有没有办法使用 spring webflux 和 reactor-netty 来实现?
- spring-boot 2.0.5.Release
- reactor-netty 0.7.9.Release
这些版本包含使用 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 请求。
有没有办法使用 spring webflux 和 reactor-netty 来实现?
- spring-boot 2.0.5.Release
- reactor-netty 0.7.9.Release
这些版本包含使用 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);
}