项目使用的shiro+jwt来做整套权限加请求安全验证,但是jwt的token自己没有超时刷新机制,所以这里简单贴出解决方案。
解决方案:通过过期时间验证,如果 在你允许的期限内重新生成token. 废话不多刷直接上代码。方法并不完美,如果有更好的方案希望大神们能告知一下(可以改成捕捉jwt抛出的超时异常)。
创建token
/**
* 生成签名
*
* @param params 你的参数 ,可以是多个。根据你的业务需求
* @return 加密的token
*/
public static String sign(String params) {
// EXPIRE_TIME : 你的有效时间。
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
// SECRET : 你的 秘匙
Algorithm algorithm = Algorithm.HMAC256(SECRET);
// 附带params信息
return JWT.create()
.withClaim("params", params)
.withExpiresAt(date)
.sign(algorithm);
}
验证token 刷新 token
/**
* 校验token是否正确
* @Description : TODO
* @param : token
* @param : params 你的参数 ,可以是多个。根据你的业务需求(必须和生成签名的参数一致)
* @return : java.lang.String
* @author : Mr.Xi
* @date : 19-4-24 上午10:41
*/
public static String verify(String token, String params) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("params", params)
.build();
DecodedJWT jwt = verifier.verify(token);
return token;
} catch (Exception exception) {
String errorStr = exception.getMessage();
String[] es = errorStr.split("The Token has expired on ");
String dateStr = es[1].substring(0,es[1].length() - 1);
Date toDate = null;
try {
toDate = parseDateString(dateStr);
// 符合条件 重新生成token
if (toDate != null && System.currentTimeMillis() - toDate.getTime() < EXPIRE_TIME) {
return sign(username,userId);
} else {
return "error";
}
} catch (ParseException e) {
e.printStackTrace();
return "error";
}
}
}
/**
* @Description : TODO 日期转换
* @param : dateStr 日期字符串
* @return : java.util.Date
* @author : Mr.Xi
* @date : 19-4-25 下午4:18
*/
private static Date parseDateString (String dateStr) throws ParseException {
SimpleDateFormat sfStart = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy",java.util.Locale.ENGLISH) ;
SimpleDateFormat sfEnd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sfEnd.format(sfStart.parse(dateStr));
return sfEnd.parse(format);
}