在 netty websockets 中跨 ChannelHandlerContext 识别用户
identify user across ChannelHandlerContext in netty websockets
我不知道如何识别用户,因为 LoggingHandler 和 SimpleChannelInboundHandler 中的 ChannelHandlerContext 不同:
class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
pipeline.addLast(new WebSocketIndexPageHandler(WEBSOCKET_PATH));
pipeline.addLast(new WebSocketFrameHandler());
pipeline.addLast(new SessionManagerAxx());
}
}
日志处理程序:
class SessionManagerAxx extends LoggingHandler {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt.equals(ServerHandshakeStateEvent.HANDSHAKE_COMPLETE)) {
///add the user
Clients.getInstance().addNewClient(ctx);
}
super.userEventTriggered(ctx, evt);
}
}
帧处理器:
class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
private static final Logger logger = LoggerFactory.getLogger(WebSocketFrameHandler.class);
@Override
protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
Clients.getInstance().getClient(ctx);
//Handle user msg
}
}
您可以向 Channel.attr(...)
添加一些内容,然后在两个处理程序中使用。
的 "State Management" 部分描述了身份验证
管道中的节点似乎没有共享ChannelHandlerContext
所以我解决了在单个 class.
中加入 FrameHandler 和 SessionManager 的问题
我不知道如何识别用户,因为 LoggingHandler 和 SimpleChannelInboundHandler 中的 ChannelHandlerContext 不同:
class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
pipeline.addLast(new WebSocketIndexPageHandler(WEBSOCKET_PATH));
pipeline.addLast(new WebSocketFrameHandler());
pipeline.addLast(new SessionManagerAxx());
}
}
日志处理程序:
class SessionManagerAxx extends LoggingHandler {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt.equals(ServerHandshakeStateEvent.HANDSHAKE_COMPLETE)) {
///add the user
Clients.getInstance().addNewClient(ctx);
}
super.userEventTriggered(ctx, evt);
}
}
帧处理器:
class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
private static final Logger logger = LoggerFactory.getLogger(WebSocketFrameHandler.class);
@Override
protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
Clients.getInstance().getClient(ctx);
//Handle user msg
}
}
您可以向 Channel.attr(...)
添加一些内容,然后在两个处理程序中使用。
管道中的节点似乎没有共享ChannelHandlerContext 所以我解决了在单个 class.
中加入 FrameHandler 和 SessionManager 的问题