开发者社区 问答 正文

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

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


展开
收起
kun坤 2020-06-06 14:26:23 517 分享 版权
1 条回答
写回答
取消 提交回答
  • 注意以下关键两步:

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

    ######明白了,对的,第二个参数就是使用了一个常量,这样不管那个用户登录都是保存了这个常量,所以这样就覆盖了前面等的用户对象是吧。
    2020-06-06 14:26:28
    赞同 展开评论
问答分类:
问答地址: