【发布时间】:2016-11-07 05:29:08
【问题描述】:
我正在使用 Guava LoadingCache 来缓存外部存储的身份验证请求。关键是对象Auth:
public class Auth {
private String username;
private String password;
public boolean equals(Object o);
}
响应是 HttpStatus、OK 或 FORBIDDEN。
当外部存储中username的密码更改时,我需要删除username的缓存记录,但问题是密码只存储为哈希,而不是原始值,所以我不能只需为失效构造新的 Auth 对象,例如:
cache.invalidate(new Auth(<username>, <password>));
我怎样才能使缓存记录无效,只使用username 值?
【问题讨论】:
-
为什么不用
Auth作为key呢? -
因为我不知道原始密码,只知道存储的 MD5 哈希。在缓存中我有原始密码的 Auth,所以它们不相等。
-
我觉得很傻,我想问的是,“为什么不用
username作为key”? -
它必须如何工作?例如,我在缓存中有两条记录:Auth(user1, password1) = OK 和 Auth(user1, password2) = FORBIDDEN。所以password1是正确的,password2是不正确的。如果我将收到更多带有 Auth(user1, password2) 的请求,我只返回 FORBIDDEN 而不查询外部存储。如果我只使用用户名作为键,我每次收到请求时都需要查询存储。