编程语言
首页 > 编程语言> > java – 有没有办法使用Guava的HashBiMap驱逐?

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

作者:互联网

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

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

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

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

更新:

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

解决方法:

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

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

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

标签:java,authentication,guava,bidirectional
来源: https://codeday.me/bug/20190621/1253758.html