zoukankan      html  css  js  c++  java
  • redis+token实现一个账号只能一个人登录

    自己在闲着没事的时候,突然想到了这么一个小功能,于是决定练习一下,首先想到的是如果一个账号只能一个人登录,可能会出现两个情况,一种是后登录者把前者的账号顶替掉,还有一种就是后者登录的时候会有提示当前账号已经登陆的信息,目前想的是这两个情况,所以打算先记录下来,如有更好的办法,请指教一二。

    1.后者登录顶替掉前者,这种方式可以保持登录不变(登录即返回token),在拦截器中判断后生成的token和通过查询redis的token是否一致即可。

          String token = req.getHeader(UserConstants.ACCESS_TOKEN);
            if (Strings.isNullOrEmpty(token)) {
                return false;
            }
            Integer userId=Integer.parseInt(JwtUtil.getUserId(token));
            String reqToken= (String) redisUtil.get(UserConstants.PREFIX_USER_TOKEN+userId);
            if (ObjectUtils.isEmpty(reqToken)) {
                return false;
            }
    //在这里对比后者生成的reqToken和前者的token,如果没有后者登录的话,token与reqToken是一致的
    if(!token.equals(reqToken)){ return false; } if(redisUtil.getExpire(UserConstants.PREFIX_USER_TOKEN+userId) <1){ return false; } redisUtil.set(UserConstants.PREFIX_USER_TOKEN + userId, reqToken,UserConstants.TOKEN_EXPIRE_TIME); return true;

    测试结果为:

     这里第二次生成token来模拟第二个登录者:

    继续使用第一个登录者的token登录显示已经失效,也就是说被T出了:

    2.第二种比第一种还要简单,在登录的时候只要查询出redis存储的用户key不为null,就直接返回 “该帐号已经登录” 的提示信息,这里的key我是在登录的控制器新添加的几行。

            String isLogin= (String) redisUtil.get(UserConstants.PREFIX_USER_TOKEN+userName);
            if (!Strings.isNullOrEmpty(isLogin)) {
                return Result.error(UserConstants.ACCOUNT_HAS_BEEN_LOGGED_IN);
            }
            redisUtil.set(UserConstants.PREFIX_USER_TOKEN + userName, userName,UserConstants.TOKEN_EXPIRE_TIME);

    拦截器中稍微修改一下,只需要加入一下设置这个key的过期时间:

         String username=JwtUtil.getUsername((String) reqToken);
            redisUtil.set(UserConstants.PREFIX_USER_TOKEN + username, username,UserConstants.TOKEN_EXPIRE_TIME);

    测试结果为:

    第一个登陆者第一次登录成功:

     

    后者在登录时候返回信息:

  • 相关阅读:
    泛在电力物联网建设路线
    如何建设泛在电力物联网?
    泛在电力物联网到底该怎么建?
    泛在电力物联网(能源互联网+物联网)浅析
    泛在电力物联网分析—架构形式
    泛在电力物联网:两个业务 两种发展逻辑
    国网“泛在电力物联网”的战略与逻辑
    MVC中使用Hangfire按秒执行任务
    hangfire 实现已完成的job设置过期,防止数据无限增长
    解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"
  • 原文地址:https://www.cnblogs.com/red-star/p/12585402.html
Copyright © 2011-2022 走看看