@JFinal 您好,向您请教个问题:版本jfina2.2 使用ehcache 保存登录对象,使用两种不同的浏览器登录,第一个登录的用户对象被第二个登录的对象覆盖了,不知道为什么。
代码:
currentUser.login(token);
//断言用户已经登录
if(!currentUser.isAuthenticated()){
setAttr("message","认证没有通过,请确认您的账号密码正确");
}
// 验证成功
SecUser loginUser = SecUser.dao.getCurrentUser(userName, pwd);
//将当前登录用户保存在缓存中
CacheKit.put(Constant.LOGIN_USER_CACHE, Constant.LOGIN_USER, loginUser);
<!-- 自定义loginUserCache -->
<cache name="loginUserCache"
maxElementsInMemory="10000"
maxElementsOnDisk="100000"
eternal="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="0"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600" />
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
注意以下关键两步:
1:登录成功生成一个全球唯一的 sessionId,存放在 cookie 中,作为用户session的凭证,通常用UUID生成即可
2:使用前面生成的 sessionId 为 key 放 loginUser 到 cache 中CacheKit.put(Constant.LOGIN_USER_CACHE, sessionId, loginUser);
关键在于为每次登录操作,无论是否是同一个用户,都生成一个 sessionId 作为 key,存放在 cookie 之中,然后做一个全局拦截器使用该 cookie 值得到 loginUser
public class LoginSessionInterceptor implements Interceptor {
public void intercept(Invocation inv) {
String sessionId = inv.getController().getCookie("sessionId");
if (sessionId != null) {
User loginUser = CacheKit.get(Constant.LOGIN_USER_CACHE, sessionId);
if (loginUser != null) {
inv.getController().setAttr("loginUser", loginUser);
}
}
inv.invoke();
}
你的程序中所犯的主要错误在于CacheKit.put(...) 的第二个参数使用不当,这个参数必须保障是全球唯一值,切勿使用 userId 否则容易通过更改 cookie值冒充合法用户,更不能使用常量,否则所有用户登录都会取代前面的登录用户。
######明白了,对的,第二个参数就是使用了一个常量,这样不管那个用户登录都是保存了这个常量,所以这样就覆盖了前面等的用户对象是吧。