修改redis的token处理方式

This commit is contained in:
wanggeng 2021-11-30 15:40:28 +08:00
parent d5b16d2b0d
commit 48beb19ef2

View File

@ -11,9 +11,8 @@ import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: RedisAppTokenManager
@ -32,10 +31,11 @@ public class RedisAppTokenService implements IAppTokenService {
@Override
public AppToken getToken(String token) {
AppToken appToken = (AppToken) redisTemplate.opsForHash().entries(TOKEN_HASH_KEY).get(token);
String tokenKey = TOKEN_HASH_KEY + token;
AppToken appToken = (AppToken) redisTemplate.opsForValue().get(tokenKey);
if (appToken != null) {
appToken.setLastTime(System.currentTimeMillis());
redisTemplate.opsForHash().put(TOKEN_HASH_KEY, appToken.getToken(), appToken);
redisTemplate.opsForValue().set(tokenKey, appToken, 10, TimeUnit.MINUTES);
}
return appToken;
}
@ -48,23 +48,25 @@ public class RedisAppTokenService implements IAppTokenService {
appToken.setLastTime(System.currentTimeMillis());
appToken.setAppTokenUser(appTokenUser);
appToken.setUserId(appTokenUser.getId());
Map<String, AppToken> tokens = redisTemplate.opsForHash().entries(TOKEN_HASH_KEY);
for (Map.Entry<String, AppToken> kvs : tokens.entrySet()) {
if (StringUtils.equals(appToken.getAppTokenUser().getId(), kvs.getValue().getUserId())) {
redisTemplate.opsForHash().delete(TOKEN_HASH_KEY, kvs.getValue().getToken());
Set<String> keys = redisTemplate.keys(TOKEN_HASH_KEY + "*");
List<AppToken> existAppTokens = redisTemplate.opsForValue().multiGet(keys);
for (AppToken existAppToken : existAppTokens) {
if (StringUtils.equals(appToken.getAppTokenUser().getId(), existAppToken.getUserId())) {
redisTemplate.delete(TOKEN_HASH_KEY + existAppToken.getToken());
break;
}
}
redisTemplate.opsForHash().put(TOKEN_HASH_KEY, appToken.getToken(), appToken);
redisTemplate.opsForValue().set(TOKEN_HASH_KEY + token, appToken, 10, TimeUnit.MINUTES);
}
@Override
public List<AppTokenUser> listCurrentUsers() {
List<AppTokenUser> users = new ArrayList<>();
Map<String, AppToken> tokens = redisTemplate.opsForHash().entries(TOKEN_HASH_KEY);
for (Map.Entry<String, AppToken> kvs : tokens.entrySet()) {
AppToken appToken = kvs.getValue();
users.add(appToken.getAppTokenUser());
Set<String> keys = redisTemplate.keys(TOKEN_HASH_KEY + "*");
List<AppToken> existAppTokens = redisTemplate.opsForValue().multiGet(keys);
for (AppToken existAppToken : existAppTokens) {
users.add(existAppToken.getAppTokenUser());
}
return users;
}
@ -72,18 +74,15 @@ public class RedisAppTokenService implements IAppTokenService {
@Override
public void clearTimeoutToken() {
long currentTime = System.currentTimeMillis();
List<String> clearTokenKeys = new ArrayList<>(0);
Map<String, AppToken> tokens = redisTemplate.opsForHash().entries(TOKEN_HASH_KEY);
for (Map.Entry<String, AppToken> kvs : tokens.entrySet()) {
AppToken appToken = kvs.getValue();
// 超过10分钟
if (currentTime - appToken.getLastTime() > 600000L) {
clearTokenKeys.add(kvs.getKey());
Set<String> clearTokenKeys = new HashSet<>(16);
Set<String> keys = redisTemplate.keys(TOKEN_HASH_KEY + "*");
List<AppToken> existAppTokens = redisTemplate.opsForValue().multiGet(keys);
for (AppToken existAppToken : existAppTokens) {
if (currentTime - existAppToken.getLastTime() > 600000L) {
clearTokenKeys.add(TOKEN_HASH_KEY + existAppToken.getToken());
}
}
for (String tokenKey : clearTokenKeys) {
redisTemplate.opsForHash().delete(TOKEN_HASH_KEY, tokenKey);
}
redisTemplate.delete(clearTokenKeys);
LOG.trace("本次共清理超时Token:{}个", clearTokenKeys.size());
}
}