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中
|
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());
|
}
|
}
|
|
|
/**
|
* @Description: 校验token
|
* @Param: [type, token] type: 后台取值:manage 前台取值:api
|
* @return: java.util.Map<java.lang.String , java.lang.Object>
|
* @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<java.lang.String , java.lang.Object>
|
* @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);
|
}
|
}
|