在TCP长连接模式下,我们需要及时释放那些未授权的TCP链接,让系统运行得更稳健一些。
首先是connect上来的TCP报文需要设置一个存活期,通过在pipleline上设置超时处理器ReadTimeoutHandler
ch.pipeline().addLast(new ReadTimeoutHandler(120));
使得一个TCP在120秒内没有收到数据就断掉。
这样做的目的是让连接者必须发TCP报文才能维持连接。
下一步在业务层对ChannelHandlerContext进行鉴权。与HTTP不同,TCP长连接的会话ChannelHandlerContext是一直存活的。只要TCP不断,每次进入处理器的ctx都是同一个对象,也是在同一个Handler对象中处理消息。基于这个考虑,可以在第一次收到TCP消息的时候启动一个定时器,等待类似鉴权的TCP消息。如果定时器超时的时候鉴权都没成功,则主动关闭这个TCP连接:ctx.close();。