java - 有没有办法将 Guava 的 HashBiMap 用于驱逐?

标签 java authentication guava bidirectional

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

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

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

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

更新:

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

最佳答案

最简单的答案是,不,您不能拥有具有自动逐出功能的 HashBiMapMapMaker 制作的 map 是专门的并发 map 。 HashBiMap 基本上只是两个 HashMap 的包装。

一个选项可能是将 UUID 存储到 User 映射到 MapMaker - 创建的映射中,并存储 User UUID 映射到另一个 MapMaker 创建的具有弱键的 map 。当逐出映射中的条目被逐出时,由于 UUID 弱引用被清除(假设没有对 UUID 的引用,因此逆映射中的条目应该很快失效在别处举行)。即使当用户再次登录时该映射仍然存在,当您在带有驱逐的映射中查找 UUID 并发现没有条目时,您知道您需要生成一个新的 UUID 并创建新的映射。

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

关于java - 有没有办法将 Guava 的 HashBiMap 用于驱逐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6860867/

相关文章:

java - flink - 集群不使用集群

java - java中如何将子类的输入提供给父类?

java - 如何防止从 IntelliJ Jetbrains 编辑器中的声明中删除前导空格?

c# - 在没有身份验证的情况下创建项目时的 ASP.NET 身份集成

ruby-on-rails-3 - 限制用户只能使用 Devise 访问其个人资料

java - 向下转型 Guava map 类

Java UIManager 行为

ios Facebook 登录 : com. facebook.sdk:ErrorLoginFailedReason = invalid_client

java - Google 在 Drools 中收集导入

java - 如何将 NavigableMap 功能与 Guava 的 Multimap(使用 asMap())一起使用?