我正在使用企业级Java后端应用程序,因此需要构建基于 token 的用户身份验证。前端利用PHP并通过SOAP与Java后端进行通信。
我考虑过使用Guava的HashBiMap来帮助解决这个问题。这对我很有用,因为我可以生成UUID token 作为键,并将User对象存储为静态HashBiMap中的值。当用户首次成功登录时,该用户将被添加到HashBiMap中,并且登录响应将返回生成的UUID token 。对于同一用户的后续SOAP请求将仅使用 token 进行。
我现在面临的问题是我需要某种驱逐逻辑,该驱逐逻辑将允许在闲置30分钟后驱逐这些 token 。在我的研究中,HashBiMap似乎不像番石榴的MapMaker本身就支持驱逐。
是否有人对我如何使用HashBiMap和支持驱逐不 Activity 的人有任何建议?如果这种方法不理想,我可以接受其他策略。
更新:
我想我需要使用HashBiMap,因为我希望能够在地图中查找User对象,如果User仍在地图中,则获取它们已经存在的 token 。例如,如果某个用户在30分钟内关闭浏览器,几分钟后返回并再次登录,则我需要检查该用户是否已存在于地图中,以便我可以返回其现有 token (因为它已经存在从技术上讲仍然有效)。
最佳答案
最简单的答案是不,您不能拥有带有自动逐出功能的HashBiMap
。 MapMaker
生成的映射是专门的并发映射。 HashBiMap
基本上只是两个HashMap
的包装。
一种选择可能是将具有驱逐功能的UUID
映射到User
映射到具有驱逐的MapMaker
创建的映射中,并将User
到UUID
映射存储在另一个具有弱键的MapMaker
创建的映射中。当逐出地图中的条目被逐出时,由于清除了UUID
弱引用(假设在其他地方没有保留对UUID
的引用),逆映射中的条目应立即失效。即使当用户再次登录时该映射仍然存在,当您在逐出的情况下查找地图中的UUID
并没有找到任何条目时,您也知道需要生成一个新的UUID
并创建新的映射。
当然,在执行所有这些操作时,您可能需要考虑任何潜在的并发问题。