package com.moral.util; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * @ClassName tokenUtils * @Description token生成、解析工具类 * @Author 陈凯裕 * @Date 2021/3/10 11:35 * @Version TODO **/ @Component @Slf4j public class TokenUtils { private static RedisTemplate redisTemplate; @Autowired @Qualifier("tokenRedisTemplate") public void setRedisTemplate(RedisTemplate redisTemplate) { TokenUtils.redisTemplate = redisTemplate; } //token有效期 单位:秒 private static final int validity_time = 60*60*24*7; //token非法,生成错误 public static final int error = -1; //token过期 public static final int timeout = -2; //token有效,生成成功 public static final int valid = 1; /** * @Description: 生成token * @Param: [type, uid] type: 后台取值:manage 前台取值:api * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static Map getToken(String uid, Map userInfo) { Map result = new HashMap<>(); //生成加密token try { //生成token String token = TokenEncryptUtils.encoded(uid + "/" + System.currentTimeMillis() / 1000); //查询旧的token String oldToken = (String) redisTemplate.opsForHash().get("user_token", uid); if(oldToken!=null) redisTemplate.delete(oldToken); //新token写入到value中 redisTemplate.opsForValue().set(token, userInfo); redisTemplate.expire(token, validity_time, TimeUnit.SECONDS); //新token写入到Hash中 redisTemplate.opsForHash().put("user_token",uid,token); result.put("code", valid); result.put("token",token); }catch (Exception e){ e.printStackTrace(); log.error(e.getMessage()); result.put("code",error); } return result; } /** * @Description: 校验token * @Param: [type, token] type: 后台取值:manage 前台取值:api * @return: java.util.Map * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static Map checkToken( String token) { Map result = new HashMap<>(); try { String[] tokenArray = TokenEncryptUtils.decoded(token).split("/"); //校验token是否合法 if (tokenArray.length != 2) { result.put("code", error); result.put("msg", "无效的token"); return result; } //校验token是否过期 int tokenTime = Integer.parseInt(tokenArray[1]); if ((System.currentTimeMillis() / 1000) - tokenTime > validity_time) { result.put("code", timeout); result.put("msg", "登陆身份已过期,请重新登陆"); return result; } result.put("code", valid); return result; } catch (Exception e) { log.error("token工具类校验token异常" + e.getMessage()); result.put("code", error); result.put("msg", "无效的token"); return result; } } //通过token获取用户信息 public static Map getUserInfoByToken(String token) { Map userInfo = (Map) redisTemplate.opsForValue().get(token); return userInfo; } }