日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Redis實現單設備登錄的場景分析_Redis

作者:等待花開I ? 更新時間: 2022-06-18 編程語言

在有些場景下,我們希望用戶一個賬號只能登錄一個設備。

這個時候我們可以用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();
    }
}

原文鏈接:https://blog.csdn.net/qq_45774645/article/details/124256314

相關推薦

欄目分類
最近更新