这节主要讲用redis存储token,跟shiro基本上没有关系。
但是与是使用shiro做无状态管理所需要的。
一、token组成:
(1)在redis中存储 [key] tokens:UUID-key [value] usernamePasswordToken的JSON字符串 [expire] 过期时间
(2)在java中的数据模型
public class Token implements Serializable {
private static final long serialVersionUID = 4043470238789599973L;
private String token;
private Date expireTime;
public Token(String token, Date expireTime) {
super();
this.token = token;
this.expireTime = expireTime;
}
}
二、token管理
用户通过redis获取token对应的登录信息。
public interface TokenManager {
Token saveToken(UsernamePasswordToken token);
UsernamePasswordToken getToken(String key);
boolean deleteToken(String key);
}
实现类的具体方法:
(1)存储token
public Token saveToken(UsernamePasswordToken usernamePasswordToken) {
String key = UUID.randomUUID().toString();
redisTemplate.opsForValue().
set(TOKEN_PREFIX + key,
JSONObject.toJSONString(usernamePasswordToken),
expireSeconds,
TimeUnit.SECONDS);
return new Token(key, DateUtils.addSeconds(new Date(), expireSeconds));
}
(2)获取token
将token转化为shiro登录信息:UsernamePasswordToken
public UsernamePasswordToken getToken(String key) {
String json = redisTemplate.opsForValue().get(TOKEN_PREFIX + key);
if (!StringUtils.isEmpty(json)) {
UsernamePasswordToken usernamePasswordToken =
JSONObject.parseObject(json, UsernamePasswordToken.class);
return usernamePasswordToken;
}
return null;
}