2021SC@SDUSC
每次访问接口的时候都需要验证传递token的有效性,常规的办法就是在每个接口中判断token的有效性,但是如果在较大的项目中有太多接口的情况下,每次都进行token的校验会太过麻烦。所以写出程序进行编程校验token有效性。
首先,获取request中传递的token
public class TokenUtils {
public static String getTokenByRequest(HttpServletRequest request) {
String token = request.getParameter("token");
if (token == null) {
token = request.getHeader("X-Access-Token");
}
return token;
}
对token进行验证,其中token内容不能为空。解密获得username,用于和数据库进行对比,判断token是否有效。之后查询用户信息,如果用户信息不存在则报错。最后校验token是否超时失效 & 或者账号密码是否错误
public static boolean verifyToken(HttpServletRequest request, ISysBaseAPI sysBaseAPI, RedisUtil redisUtil) {
log.info(" -- url --" + request.getRequestURL());
String token = getTokenByRequest(request);
if (StringUtils.isBlank(token)) {
throw new AuthenticationException("token不能为空!");
}
String username = JwtUtil.getUsername(token);
if (username == null) {
throw new AuthenticationException("token非法无效!");
}
LoginUser user = sysBaseAPI.getUserByName(username);
if (user == null) {
throw new AuthenticationException("用户不存在!");
}
if (user.getStatus() != 1) {
throw new AuthenticationException("账号已被锁定,请联系管理员!");
}
if (!jwtTokenRefresh(token, username, user.getPassword(), redisUtil)) {
throw new AuthenticationException("Token失效,请重新登录!");
}
return true;
}
刷新token,保证用户在线操作不掉线;之后校验token有效性;设置Toekn缓存有效时间。在for循环中解决每次请求,都重写redis中 token缓存问题
private static boolean jwtTokenRefresh(String token, String userName, String passWord, RedisUtil redisUtil) {
String acheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));
if (oConvertUtils.isNotEmpty(cacheToken)) {
if (!JwtUtil.verify(cacheToken, userName, passWord)) {
String newAuthorization = JwtUtil.sign(userName, passWord);
redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);
}
return true;
}
return false;
}