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

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);

测试结果为:

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

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

最新文章

  1. 简单的Linux的用户权限管理
  2. sms-provider
  3. 《TCP/IP详解 卷一》读书笔记-----TCP数据流
  4. apache 配置多个虚拟主机
  5. linux下挂载另一系统硬盘。
  6. Code First研究学习2_基本的错误及解决方法
  7. iOS开发之网络请求(基于AFNetworking的再封装)
  8. api 跳转规则
  9. POJ 1166 The Clocks
  10. WinForm ListView
  11. javascript第八章--事件
  12. scikit-learn入门导航
  13. 122A
  14. git部署
  15. python线程死锁与递归锁
  16. Linux命令行常用光标移动快捷键
  17. /dev/mem直接操作硬件寄存器
  18. bzoj3609 [Heoi2014]人人尽说江南好
  19. Friendly ARM linux交叉编译问题解决
  20. SQL2005、SQL2008如何压缩日志文件(log) 如何清除日志

热门文章

  1. Luckysheet文档 设置表格内容和背景色
  2. 【Frida】打印方法的调用堆栈
  3. Visualization: Pie Chart(可视化:饼图)
  4. maven-阿里云镜像
  5. 单个Java文件连接数据库demo
  6. 01爬取豆瓣网电影数据进行numpy的练习
  7. 1、docker 安装
  8. js复制图片
  9. 初学银河麒麟linux笔记 第一章 虚拟机、麒麟系统、QT安装与运行
  10. errgroup.Group