自己在閑着沒事的時候,突然想到了這么一個小功能,於是決定練習一下,首先想到的是如果一個賬號只能一個人登錄,可能會出現兩個情況,一種是后登錄者把前者的賬號頂替掉,還有一種就是后者登錄的時候會有提示當前賬號已經登陸的信息,目前想的是這兩個情況,所以打算先記錄下來,如有更好的辦法,請指教一二。
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);