Redis實現(xiàn)單設備登錄的場景分析
在有些場景下,我們希望用戶一個賬號只能登錄一個設備。
這個時候我們可以用Redis來實現(xiàn)。
原理: 用戶首次登錄時,將用戶信息存入Redis,key是用戶id,value是token。當用戶在其他設備登錄時,會重新生成token,這個時候原先的token已經(jīng)被覆蓋了。所以用戶在訪問需要登錄賬號的操作時,系統(tǒng)會攔截請求判斷token是否存在。當然是不存在的,所以我們就實現(xiàn)了單個設備登錄的需求。
這里只提供大概的樣例。
用戶登錄
@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);
}攔截器
攔截哪些操作需要用戶登錄,在攔截器中實現(xiàn)單設備登錄。
說明: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實現(xiàn)單設備登錄的文章就介紹到這了,更多相關redis單設備登錄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Redis Sorted Set 跳表的實現(xiàn)示例
本文詳細解析了Redis中SortedSet跳表的實現(xiàn)原理,闡述了跳表的基本概念、結構及其在SortedSet中的應用,同時也指出了跳表在實際使用中的優(yōu)勢和局限,可以更好地運用Redis的SortedSet,優(yōu)化高并發(fā)環(huán)境中的數(shù)據(jù)查詢與操作,感興趣的可以了解一下2024-10-10
Redis高效查詢大數(shù)據(jù)的實踐與優(yōu)化詳細指南
Redis 是一種高性能的鍵值存儲數(shù)據(jù)庫,廣泛應用于緩存,排行榜,計數(shù)器等場景,本文將圍繞如何高效查詢Redis中滿足條件的數(shù)據(jù)展開討論,感興趣的小伙伴可以了解下2025-04-04
Redis?SortedSet數(shù)據(jù)類型及其常用命令總結
Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層數(shù)據(jù)結構卻差別很大,這篇文章主要介紹了Redis?SortedSet數(shù)據(jù)類型及其常用命令詳解,需要的朋友可以參考下2024-06-06
Redis基本數(shù)據(jù)類型Zset有序集合常用操作
這篇文章主要為大家介紹了redis基本數(shù)據(jù)類型Zset有序集合常用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
基于Redis實現(xiàn)分布式鎖的方法(lua腳本版)
這篇文章主要介紹了基于Redis實現(xiàn)分布式鎖的方法(lua腳本版),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05

