您可以将登录用户的映射存储在应用程序范围变量(如 ServletContext)上。例如,在您的身份验证 servlet 上,您可能可以执行以下操作:
Map<String,String> activeUsers = request.getSession().getServletContext().getAttribute("__ONLINE_AUTHENTICATED_USERS");
//if null, context hasn't been prepared yet, create and attach a new one?2
不过你必须小心。作为应用程序范围变量,您需要确保一些线程安全,这是 servletContext.setAttribute/getAttribute 提供的(例如,这些操作不是线程安全的)。您可以通过使用某种应用程序生命周期侦听器来“初始化”servletContext 以获取用户映射来处理此问题。这样您就无需担心 set/getAttribute。您仍然需要考虑地图操作本身(例如使用 jucConcurrentHashMap 可能吗?)。
当用户注销或会话超时时,您还必须注意清理(例如从地图中删除)。
您还必须考虑到用户可能会通过这种方法将自己锁定很长时间(例如关闭浏览器但未正确注销,会话需要在映射被清除之前超时)。
编辑:您还需要考虑可伸缩性,这取决于您的应用程序。你期待一百万在线用户吗?还是只有几千?