有没有办法使用Guava的HashBiMap驱逐?

时间:2011-07-28 14:42:46

标签: java authentication guava bidirectional

我正在使用企业级Java后端应用程序,我需要构建基于令牌的用户身份验证。前端使用PHP并通过SOAP与Java后端通信。

我想过使用Guava的HashBiMap来帮助解决这个问题。这对我很有用,因为我可以生成UUID标记作为键,并将User对象存储为静态HashBiMap中的值。当用户首次成功登录时,用户将被添加到HashBiMap,登录响应将返回生成的UUID令牌。对同一用户的后续SOAP请求将仅使用令牌进行。

我现在面临的问题是我需要某种驱逐逻辑,这种逻辑可以让这些代币在30分钟不活动后被驱逐。在我的研究中,似乎HashBiMap本身并不像Guava MapMaker那样支持驱逐。

有没有人对如何使用HashBiMap并支持驱逐不活动有任何建议?如果这种方法不理想,我会接受其他策略。

更新

我认为我需要使用HashBiMap,因为我希望能够在地图中查找User对象,并在User仍在地图中时获取已存在的令牌。例如,如果用户在30分钟的窗口内关闭浏览器,几分钟后返回并重新登录,我需要检查用户是否已经存在于地图中,以便我可以返回他们现有的令牌(因为它技术上仍然有效。)

2 个答案:

答案 0 :(得分:3)

最简单的答案是,不,你不能自动驱逐HashBiMapMapMaker制作的地图是专门的并发地图。 HashBiMap基本上只是两个HashMap的包装器。

一个选项可能是将UUIDUser映射存储在MapMaker - 已创建的地图中并逐出,并将User存储到UUID映射中另一个MapMaker - 创建了具有弱键的地图。当驱逐地图中的条目被驱逐时,反向地图中的条目应该很快失效,因为UUID弱引用被清除(假设其他地方没有引用UUID)。即使用户再次登录时该映射仍然存在,当您在地图中查找UUID并且没有发现任何条目时,您知道需要生成新的{{1}并创建新的映射。

当然,在执行所有这些操作时,您可能需要考虑任何潜在的并发问题。

答案 1 :(得分:2)

为了回应@ColinD的回答,HashBiMap是一个非惰性的地图包装器;因此,您不会自动查看MapMaker中反映的BiMap地图的更改。

但是,一切都不会丢失。 @ColinD建议使用两张地图。为了更进一步,为什么不将这两个映射包装在基于视图的自定义BiMap实现中,而不是复制源映射(如HashBiMap那样)。这将为您提供来自BiMap的富有表现力的API以及您需要的自定义功能。