在 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(...) 添加一些内容,然后在两个处理程序中使用。

ChannelHandler javadoc

的 "State Management" 部分描述了身份验证

管道中的节点似乎没有共享ChannelHandlerContext 所以我解决了在单个 class.

中加入 FrameHandler 和 SessionManager 的问题