最近工作需要开发基于无状态的api,平时使用的是spring mvc,感觉没有找到相关比较好的实现的开源项目,所以就自己实现了一个来管理token。
逻辑:大概是当通过用户验证后创建一个用户tokenmodel并存入tokenmodel仓库。然后返回给用户有用户信息和当前时间轴生成的加密字符,当带有token的请求到来时,根据请求参数中的用户从仓库中拿出相关用户信息并根据之前生成token的算法生成字符串并与用户请求中的token对比。
代码:
/**
* TokenHandler
*
* 生产token和校验token
*
* @author doob
* @date 16/9/10
*/
public interface TokenHandler {
/**
* 添加一个用户的tokenmodel,并返回给用户token
* @param tokenModel
* @return 登录后反馈给用户端的token
*/
String addToken(TokenModel tokenModel);
/**
* 检查token是否有效
* @param userId 用户唯一标示
* @param token 请求上传token
* @return
*/
boolean checkToken(String userId , String token);
}
/**
* TokenModelRepository
*
* 隐藏tokenmodel储存的具体实现
*
* @author doob
* @date 16/9/9
*/
public interface TokenModelRepository {
/**
* 根据用户名获取tokenmodel
* @param userId
* @return
*/
TokenModel get(String userId);
/**
* 保存一个tokenmodel
*
* @param tokenModel
* @return
*/
boolean save(TokenModel tokenModel);
/**
* 删除一个用户tokenmodel
*
* @param userId
* @return
*/
TokenModel delete(String userId);
/**
* 设置token超时时间
*
* @param seconds 多少秒
* @return
*/
boolean setTokenTimeout(long seconds);
}
import com.mofang.common.Encryptor; //加密的具体算法类
import com.mofang.common.api.signature.Timestamp; //获取当前时间轴的类
/**
* TokenModel
*
* token实体类,用于储存token相关信息
*
* @author doob
* @date 16/9/9
*/
public class TokenModel {
private String userId;
private long createTime;
private long lastTime;
public TokenModel(String userId) {
this.userId = userId;
this.createTime = Timestamp.nowSeconds();
this.lastTime = this.createTim