package com.moral.util; import com.moral.constant.ResponseCodeEnum; import com.moral.exception.TokenException; 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 org.springframework.util.ObjectUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; 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 * 30; //判断user_token里有没有用户的token public static boolean hHasKey(String uid) { return redisTemplate.opsForHash().hasKey("user_token", uid); } //根据用户id获取token public static Object hget(String uid) { return redisTemplate.opsForHash().get("user_token", uid); } /** * @Description: 生成token, 并且将用户信息存入缓存 * @Param: [uid] type: 后台取值:manage 前台取值:api * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static String getToken(String uid, Object userInfo) { //生成加密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); return token; } catch (Exception e) { log.error("token生成异常:" + e.getMessage()); throw new TokenException(ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode(), ResponseCodeEnum.TOKEN_CREATE_ERROR.getMsg()); } } public static String getTokenApp(String uid, Object userInfo) { //生成加密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中 getRefreshTokenApp(token,userInfo); //redisTemplate.expire(token, validity_time, TimeUnit.SECONDS); //新token写入到Hash中 redisTemplate.opsForHash().put("user_token", uid, token); return token; } catch (Exception e) { log.error("token生成异常:" + e.getMessage()); throw new TokenException(ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode(), ResponseCodeEnum.TOKEN_CREATE_ERROR.getMsg()); } } public static void getRefreshTokenApp(String token, Object userInfo) { redisTemplate.opsForValue().set(token, userInfo); } /** * @Description: 校验token * @Param: [type, token] type: 后台取值:manage 前台取值:api * @return: java.util.Map * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static boolean checkToken(String token) { try { String[] tokenArray = TokenEncryptUtils.decoded(token).split("/"); //校验token是否合法 if (tokenArray.length != 2) { throw new TokenException(ResponseCodeEnum.TOKEN_INVALID.getCode(), ResponseCodeEnum.TOKEN_INVALID.getMsg()); } //校验token是否过期 if (!redisTemplate.hasKey(token)) { throw new TokenException(ResponseCodeEnum.TOKEN_INVALID.getCode(), ResponseCodeEnum.TOKEN_INVALID.getMsg()); } } catch (Exception e) { return false; } return true; } /** * @Description: 通过token获取用户信息 * @Param: [token] * @return: java.util.Map * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static Object getUserInfoByToken(String token) { Object userInfo = redisTemplate.opsForValue().get(token); if (userInfo == null) throw new TokenException(ResponseCodeEnum.TOKEN_INVALID.getCode(), ResponseCodeEnum.TOKEN_INVALID.getMsg()); return userInfo; } public static Object getUserInfo() { String token = getCurrentToken(); return getUserInfoByToken(token); } /** * @Description: 销毁token * @Param: [uid, token] * @return: void * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static void destoryToken(String uid, String token) { if(ObjectUtils.isEmpty(uid)||ObjectUtils.isEmpty(token)) return; redisTemplate.delete(token); redisTemplate.opsForHash().delete("user_token", uid); } /** * @Description: 销毁token * @Param: [token] * @return: void * @Author: 陈凯裕 * @Date: 2021/4/1 */ public static void destoryToken(String token) { destoryToken(getUidByToken(token), token); } /** * @Description: 销毁当前连接的token * @Param: [] * @return: void * @Author: 陈凯裕 * @Date: 2021/5/21 */ public static void destoryToken() { destoryToken(getCurrentToken()); } public static void destoryToken(Integer id) { String token = getTokenById(id); destoryToken(String.valueOf(id),token); } /** * @Description: 根据id获取token * @Param: [] * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/5/21 */ public static String getTokenById(Integer id) { return (String) getTokenById(id.toString()); } public static String getTokenById(String id) { return (String)redisTemplate.opsForHash().get("user_token", String.valueOf(id)); } /** * @Description: 根据TOKEN获取Id * @Param: [token] * @return: void * @Author: 陈凯裕 * @Date: 2021/4/1 */ public static String getUidByToken(String token) { String[] string = TokenEncryptUtils.decoded(token).split("/"); return string[0]; } /** * @Description: 获取当前请求的token * @Param: [] * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/5/21 */ public static String getCurrentToken() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return request.getHeader("token"); } /** * @Description: token延长 * @Param: [token] * @return: void * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static void extendTokenTime(String token) { redisTemplate.expire(token, validity_time, TimeUnit.SECONDS); } }