Redis实现一个账号只能登录一个设备


Posted in Redis onApril 19, 2022

在有些场景下,我们希望用户一个账号只能登录一个设备。

这个时候我们可以用Redis来实现。

原理: 用户首次登录时,将用户信息存入Redis,key是用户id,value是token。当用户在其他设备登录时,会重新生成token,这个时候原先的token已经被覆盖了。所以用户在访问需要登录账号的操作时,系统会拦截请求判断token是否存在。当然是不存在的,所以我们就实现了单个设备登录的需求。

这里只提供大概的样例。

用户登录

@PostMapping("login")
@ApiOperation(value = "用户登录",notes = "用户登录")
public GraceJSONResult login(@RequestParam String userId,HttpServletRequest request) throws Exception {
    String uToken = UUID.randomUUID().toString();
    //把token存入redis
    redis.set("redis_user_token"+":"+userId,uToken);
    //返回用户信息,包含token
    return GraceJSONResult.ok(usersVO);
}

拦截器

拦截哪些操作需要用户登录,在拦截器中实现单设备登录。

说明:BaseInfoProperties是共有的代码,集成这个类就可以直接使用reidis。

public class BaseInfoProperties {
    @Autowired
    public RedisOperator redis;
}

说明:GraceException是自定义的抛出异常的类,这里不做展示。

public class UserTokenInterceptor extends BaseInfoProperties implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userId = request.getHeader("headerUserId");
        String userToken = request.getHeader("headerUserToken");
        // 判断用户id和token是否为空
        if(StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(userToken)){
            String redisToken=redis.get(REDIS_USER_TOKEN+":"+userId);
            //判断token是否失效
            if(StringUtils.isBlank(redisToken)){
                GraceException.display(ResponseStatusEnum.UN_LOGIN);
                return false;
            }else {
                //判断token是否一致,如果不一致,表示用户在别的手机端登录,token被覆盖了
                if(!redisToken.equalsIgnoreCase(redisToken)){
                    GraceException.display(ResponseStatusEnum.TICKET_INVALID);
                    return false;
                }
            }
        }else {
            // 用户id和token为空
            GraceException.display(ResponseStatusEnum.UN_LOGIN);
            return false;
        }

        return true;
    }
}

注册拦截器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer{
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //要拦截的请求,哪些需要登录
        registry.addInterceptor(userTokenInterceptor())
                .addPathPatterns("/userInfo/modifyUserInfo")
                .addPathPatterns("/userInfo/modifyImage");
    }
    //用户未登录拦截器
    @Bean
    public UserTokenInterceptor userTokenInterceptor() {
       return  new UserTokenInterceptor();
    }
}

到此这篇关于Redis实现单设备登录的文章就介绍到这了!

Redis 相关文章推荐
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
Redis持久化与主从复制的实践
Apr 27 Redis
使用Redis实现秒杀功能的简单方法
May 08 Redis
Redis实现订单自动过期功能的示例代码
May 08 Redis
详解Redis主从复制实践
May 19 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
Redis 限流器
May 15 Redis
Redis基本数据类型List常用操作命令
Jun 01 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 #Redis
Redis实战高并发之扣减库存项目
Redis中key的过期删除策略和内存淘汰机制
解决 Redis 秒杀超卖场景的高并发
redis 解决库存并发问题实现数量控制
Redis超详细讲解高可用主从复制基础与哨兵模式方案
redis复制有可能碰到的问题汇总
Apr 03 #Redis
You might like
牡丹941资料
2021/03/01 无线电
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
jQuery 方法大全方便学习参考
2010/02/25 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
简单实现python爬虫功能
2015/12/31 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
python实现flappy bird小游戏
2018/12/24 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Python使用re模块验证危险字符
2020/05/21 Python
python实现数字炸弹游戏
2020/07/17 Python
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
求职简历的自我评价
2014/01/31 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
实习单位鉴定意见
2015/06/04 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
合作意向书范本
2019/04/17 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL
JS class语法糖的深入剖析
2022/07/07 Javascript