簡體   English   中英

在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());   

    }
}

LoggingHandler:

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);
    }
}

FrameHandler:

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的 “狀態管理”部分中描述

似乎管道中的節點不共享ChannelHandlerContext,所以我解決了在單個類中加入FrameHandler和SessionManager的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM