Redis实现单设备登录的场景分析
2023-06-13 09:19:49 时间
在有些场景下,我们希望用户一个账号只能登录一个设备。
这个时候我们可以用Redis来实现。
原理: 用户首次登录时,将用户信息存入Redis,key是用户id,value是token。当用户在其他设备登录时,会重新生成token,这个时候原先的token已经被覆盖了。所以用户在访问需要登录账号的操作时,系统会拦截请求判断token是否存在。当然是不存在的,所以我们就实现了单个设备登录的需求。
这里只提供大概的样例。
拦截哪些操作需要用户登录,在拦截器中实现单设备登录。
说明: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;
}
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单设备登录内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Redis实现单设备登录的场景分析
相关文章
- 设置Redis默认过期时间的正确策略(redis默认过期时间)
- Redis:优雅的多种数据库之间的迁移(redis不同的数据库)
- 基于Redis的分布式计算设计与实现(redis设计与实现)
- 运算Redis实现高效的数值运算(redis数值)
- Redis 集合实现:高效存储数据的最佳选择(redis集合实现)
- 数据库从零开始:Redis数据库的遍历指南(如何遍历redis)
- 快速读写使用Redis轻松实现高并发快速读写(redis 高并发实现)
- 张益军为Redis打开新大门(张益军 redis)
- 秒杀站利用Redis实现瞬间高效率(秒杀redis原理)
- 深入浅出查看Redis中的值(查redis值)
- 指定Redis实现高性能数据存储(指定redis)
- 优化Redis调用,降低系统开销(减少redis 调用)
- 凌晨的决策清空Redis缓存(凌晨清空redis)
- 使用Redis脚本实现高效的数据存储(写一个redis的脚本)
- 公网连接Redis集群安全可靠的数据存储方案(redis集群公网连接)
- 高可用绑定技术,实现Redis集群的高可用(redis集群 bind)
- 使用Redis实现随机匹配的房间研究(redis 随机房间)
- Redis锁的自动续期实现机制(redis锁自动续期实现)
- Redis配置与优化实现性能最大化(redis配置和优化)
- 使用Redis实现远程设置(redis远程设置)
- Redis简洁而有效的进程解释(redis 进程解释)
- 解读Redis中过期Key的影响(redis过期的影响)
- Redis实现快速调整库存量(redis 调整库存)
- 优化利用Redis技术实现读写频繁场景性能优化(redis读写频繁性能)
- 一步步指导搭建Redis外网访问环境(redis配置外网地址)