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);

測試結果為:

第一個登陸者第一次登錄成功:

 

后者在登錄時候返回信息:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM