我正在使用企业级Java后端应用程序,我需要构建基于令牌的用户身份验证。前端使用PHP并通过SOAP与Java后端通信。
我想过使用Guava的HashBiMap来帮助解决这个问题。这对我很有用,因为我可以生成UUID标记作为键,并将User对象存储为静态HashBiMap中的值。当用户首次成功登录时,用户将被添加到HashBiMap,登录响应将返回生成的UUID令牌。对同一用户的后续SOAP请求将仅使用令牌进行。
我现在面临的问题是我需要某种驱逐逻辑,这种逻辑可以让这些代币在30分钟不活动后被驱逐。在我的研究中,似乎HashBiMap本身并不像Guava MapMaker那样支持驱逐。
有没有人对如何使用HashBiMap并支持驱逐不活动有任何建议?如果这种方法不理想,我会接受其他策略。
更新
我认为我需要使用HashBiMap,因为我希望能够在地图中查找User对象,并在User仍在地图中时获取已存在的令牌。例如,如果用户在30分钟的窗口内关闭浏览器,几分钟后返回并重新登录,我需要检查用户是否已经存在于地图中,以便我可以返回他们现有的令牌(因为它技术上仍然有效。)
答案 0 :(得分:3)
最简单的答案是,不,你不能自动驱逐HashBiMap
。 MapMaker
制作的地图是专门的并发地图。 HashBiMap
基本上只是两个HashMap
的包装器。
一个选项可能是将UUID
至User
映射存储在MapMaker
- 已创建的地图中并逐出,并将User
存储到UUID
映射中另一个MapMaker
- 创建了具有弱键的地图。当驱逐地图中的条目被驱逐时,反向地图中的条目应该很快失效,因为UUID
弱引用被清除(假设其他地方没有引用UUID
)。即使用户再次登录时该映射仍然存在,当您在地图中查找UUID
并且没有发现任何条目时,您知道需要生成新的{{1}并创建新的映射。
当然,在执行所有这些操作时,您可能需要考虑任何潜在的并发问题。
答案 1 :(得分:2)
为了回应@ColinD的回答,HashBiMap
是一个非惰性的地图包装器;因此,您不会自动查看MapMaker
中反映的BiMap
地图的更改。
BiMap
实现中,而不是复制源映射(如HashBiMap
那样)。这将为您提供来自BiMap
的富有表现力的API以及您需要的自定义功能。