项目系统Netty的Channel和用户之间的关系绑定正确做法,以及Channel通道的安全性方案
前言 考虑一个功能业务,在 web 程序中向指定的某个用户进行实时通讯 在Web运用的 Socket 通讯功能中(如在线客服),为保证点对点通讯.而这个看似简单的根据用户寻到起 channel 通道实际会碰到不少问题 web程序中的 Http 协议是无状态的 一般项目中 socket 服务和 web 项目是独立部署的 socket 连接存在重连的情况,而 Channel 对象每次都不一样 Channel 是面向网卡绑定的,无法序列化 解决方案 通过管理一个线程安全的 用户标识 (如用户主键)和对应 channel 的 map 链表 private final ConcurrentHashMap<String, Channel> channelMap = new ConcurrentHashMap<>(); 那么问题来了, 在 netty 模块中怎么得到这个 用户标识 ? 又如何保证 netty socket 模块可以安全的识别某个通道属于某个用户?(这个可以像上面一样的方式解决) netty socket 模块接收到一条消息又任何证明这条通道是可信的? 在 netty 的实现中是没有认证也没有 HttpSession 这个东西的,也就是说.在 netty 程序线程中是无法得到web项目登录的用户情况的. 出于这点,参考 web 项目集群的 session 共享方案