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);
测试结果为:
第一个登陆者第一次登录成功:

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

redis+token实现一个账号只能一个人登录的更多相关文章
- asp.net mvc 简单实现一个账号只能在一个地方登录
原理: 假设用户在机器A登陆后, 这时用户再次在机器B登陆,会以当前会话的SessionID作为键,用户id作为值,插入dictionary集合中,集合再保存在application(保存在服务器 ...
- java保持同一时间同一账号只能在一处登录
//登录页面 login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...
- java 实现 一个账号只能在一个地方登陆,其他地方被下线
其实方法有很多的,我这献丑了. 使用理解java 四大作用域. 思路:理解java 四大作用域的关键. 第一个地方登陆: 1.得到请求的SessionId 和 登陆的 用户名 2.把SessionId ...
- SpringMVC实现账号只能在一处登陆
一.问题引导 在Web开发中,实现一个账号只能在一处登陆有两种形式:1.当某个账号在某处登陆后,如果再在其他处登陆,将前一个账号挤掉:2.当某个账号登陆后,此账号在其他设备登陆提示已经登陆,无法登陆. ...
- Asp.net 实现只能允许一个账号同时只能在一个地方登录
先上帮助类: /// <summary> /// 单点登录帮助类 /// </summary> public class SSOHelper { /// <summary ...
- 使用token和redis怎样判断账户是否失效和异地登录
思路: 将token作为value,账户的id作为key 每次登录都去redis中查询该账户的登录是否过期,没有过期则删掉原来的id,token,将新生成token作为value存入redis中.过期 ...
- php 实现同一个账号同时只能一个人登录
php 实现同一个账号同时只能一个人登录 张映 发表于 2015-01-22 分类目录: php 标签:mysql, nginx, openfire, php, redis 以前考虑过这个问题,今天实 ...
- laravel基于redis实现的一个简单的秒杀系统
说明:网上很多redis秒杀系统的文章,看的都是一头雾水,然后自己来实现一个,也方便以后自己学习 实现的方式是用的redis的list队列,框架为laravel 核心部分为list的pop操作,此操作 ...
- shiro解决一个账号异地登录的问题
如下,找到session中的信息删除即可,按照这个方式试了下.基本可用 在多台服务器部署时,前提必须实现session共享. /** * 登录认证 * @param token * @return * ...
- PPTP VPN 限制一个账号只允许一个用户来登录
创建auth-up文件 vi /etc/ppp/auth-up chmod a+x /etc/ppp/auth-up auth-up脚本内容如下 #!/bin/sh # get the usernam ...
随机推荐
- 右键无法新建word文件怎么办?
电脑用久了,总会出现奇奇怪怪的问题. 我最近遇到一个问题:鼠标右键无法新建word文件.如何解决此问题呢? 刚开始,我忍了.解决方法为:把word图标固定到任务栏,就好了呗,需要用的时候, ...
- apk文件查看指纹证书方法
1. 先将apk文件重命名为zip文件 2. 解压zip到指定一个文件夹下,其中的META-INF/CERT.RSA文件即MD5签名文件 3. cmd下打开窗口,输入如下命令: keytool -pr ...
- Kubernetes--Pod存活性探测(设置exec探针)
有不少应用程序长时间持续运行后会逐渐转为不可用状态,并且仅能通过重启操作恢复,Kubernetes的容器存货性探测机制可发现诸如此类的问题,并根据探测结果结合重启策略触发后续的行为.存活性探测是隶属于 ...
- com.mysql.cj.jdbc.exceptions.CommunicationsException
mysql数据库链接空闲一段时间后就会关闭连接,但是我们的java程序依然持有该连接的引用,对已经关闭的数据库连接进行操作就会引发上述异常. 解决办法: 1.增大mysql数据库的wait_timeo ...
- [Swift]创建桥接文件,Swift使用MJRefresh刷新插件
刚开始玩Swift,想做个下拉刷新的功能,发现在OC中用得比较多的第三方插件是MJRefresh.查了一下,在Swift中使用OC的插件要通过桥接文件,然后又百度一下怎么创建桥接文件,发现很多都是老司 ...
- js防止表单重复方法
用flag标识,下面的代码设置checkSubmitFlg标志: <script language=""javascript""> var chec ...
- keeplive 双击热备方案 (对haproxy负载均衡 )双击热备方案
1.安装 keepalived ,必选安装在haproxy 容器之内 1.进入容器:docker exec -it h1 bash 后执行下面步骤 1.更新apt-get apt-get upd ...
- AI-Chat问答随笔
Q: 操作系统和驱动的关系 A:操作系统和驱动程序是紧密相关的,它们一起构成了计算机系统中的软件部分,实现了对硬件资源的管理和控制.操作系统作为计算机系统的核心软件,主要负责管理和协调计算机系统中的各 ...
- Timer VS DispatcherTimer
Timer是在ThreadPool线程池中执行的,每当计时器到期时,就会创建一个线程来执行事件处理程序.这种实现方式可能会导致一些问题,例如计时器事件处理程序可能会与主线程竞争资源,从而导致性能问题. ...
- 代码格式 linux
indent -kr -i8 -ts8 -sob -l80 -ss -bs -psl test.c