4

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

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

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

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

更新:

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

4

2 回答 2

3

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

一种选择可能是将UUIDtoUser映射存储在MapMaker具有驱逐的 -created 映射中,并将UsertoUUID映射存储在另一个MapMaker具有弱键的 -created 映射中。当被驱逐的映射中的条目被驱逐时,反向映射中的条目应该很快失效,因为UUID弱引用被清除(假设没有引用UUID被保存在其他地方)。即使当用户再次登录时该映射仍然存在,当您UUID在带有 eviction 的地图中查找并发现没有条目时,您知道您需要生成一个新的UUID映射并创建新的映射。

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

于 2011-07-28T22:17:39.987 回答
2

呼应@ColinD 的答案,HashBiMap是一个非惰性地图包装器;因此,您不会自动看到MapMaker反映在BiMap.

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

于 2011-07-28T23:19:44.203 回答