配置
redis:
host: 192.*.*.*
port: 6379
database: 4
password:
timeout: 5s #连接超时时间
jedis:
pool:
maxActive: 100 #连接池最大连接数(使用负值表示没有限制)
maxWait: 3s #连接池最大阻塞等待时间(使用负值表示没有限制)
maxIdle: 100 #连接池中的最大空闲连接
minIdle: 0 #连接池中的最小空闲连接
代码
@Component
public class TokenManager {
private static long timeout = 0;
@Resource
private StringRedisTemplate redis;
@Value("${project.token}")
public void setTimeout(long timeout) {
TokenManager.timeout = timeout;
}
/**
* 生成token
*/
public AccessToken createToken(User user, String platform) {
// deleteTokenByUserId(userId);//单点登录
//使用uuid作为源token
String token = UUID.randomUUID().toString().replace("-", "");
AccessToken model = new AccessToken();
model.setToken(token);
model.setUserId(user.getId());
model.setRoleId(user.getRoleId());
model.setOrgCode(user.getOrgCode());
model.setLevel(user.getLevel());
model.setPlatform(platform);
//存储到redis并设置过期时间
redis.boundValueOps(token).set(JSON.toJSONString(model), timeout, TimeUnit.HOURS);
redis.boundValueOps(user.getId() + "").set(token, timeout, TimeUnit.HOURS);
return model;
}
/**
* 检查token是否有效
*/
AccessToken checkToken(String token) {
if (token == null || token.isEmpty()) return null;
String str = redis.boundValueOps(token).get();
if (str == null) return null;
AccessToken model = JSON.parseObject(str, AccessToken.class);
//如果验证成功,说明此用户进行了一次有效操作,延长token的过期时间
redis.boundValueOps(token).expire(timeout, TimeUnit.HOURS);
redis.boundValueOps(model.getUserId() + "").expire(timeout, TimeUnit.HOURS);
return model;
}
/**
* 获取token
*/
public AccessToken getToken(String token) {
AccessToken result = new AccessToken();
if (token == null || token.isEmpty()) return result;
String str = redis.boundValueOps(token).get();
if (str == null) return result;
return JSON.parseObject(str, AccessToken.class);
}
/**
* 清除token
*/
public void deleteToken(String token) {
if (token == null || token.isEmpty()) return;
String str = redis.boundValueOps(token).get();
if (str == null) return;
AccessToken model = JSON.parseObject(str, AccessToken.class);
redis.delete(token);
redis.delete(model.getUserId() + "");
}
/**
* 根据用户id清除token
*/
public void deleteTokenByUserId(Long userId) {
if (userId == null) return;
String token = redis.boundValueOps(userId + "").get();
if (token == null) return;
deleteToken(token);
}
}