jfinal 中cache 保存登录对象的问题

Mr.Wong 发布于 2016/05/26 21:51
阅读 286
收藏 1

@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" />


加载中
0
JFinal
JFinal

注意以下关键两步:

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值冒充合法用户,更不能使用常量,否则所有用户登录都会取代前面的登录用户。

0
Mr.Wong
Mr.Wong
明白了,对的,第二个参数就是使用了一个常量,这样不管那个用户登录都是保存了这个常量,所以这样就覆盖了前面等的用户对象是吧。
返回顶部
顶部