cjl
2025-01-06 27e6bc3df3e39e0d0b147b155a89ad6837ea972b
screen-common/src/main/java/com/moral/util/TokenUtils.java
@@ -1,14 +1,20 @@
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 java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;
/**
@@ -21,7 +27,6 @@
@Component
@Slf4j
public class TokenUtils {
    private static RedisTemplate redisTemplate;
    @Autowired
@@ -31,75 +36,211 @@
    }
    //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;
    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: [type, uid] type: 后台取值:manage  前台取值:api
     * @Description: 生成token, 并且将用户信息存入缓存
     * @Param: [uid] type: 后台取值:manage  前台取值:api
     * @return: java.lang.String
     * @Author: 陈凯裕
     * @Date: 2021/3/10
     */
    public static Map<String, Object> getToken(String uid, Map<String, Object> userInfo) {
        Map<String, Object> result = new HashMap<>();
    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);
            result.put("code", valid);
            result.put("token",token);
        }catch (Exception e){
            e.printStackTrace();
            log.error(e.getMessage());
            result.put("code",error);
            //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());
        }
        return result;
    }
    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<java.lang.String                               ,                               java.lang.Object>
     * @return: java.util.Map<java.lang.String                                                                                                                               ,                                                                                                                               java.lang.Object>
     * @Author: 陈凯裕
     * @Date: 2021/3/10
     */
    public static Map<String, Object> checkToken( String token) {
        Map<String, Object> result = new HashMap<>();
    public static boolean checkToken(String token) {
        try {
            String[] tokenArray = TokenEncryptUtils.decoded(token).split("/");
            //校验token是否合法
            if (tokenArray.length != 2) {
                result.put("code", error);
                result.put("msg", "无效的token");
                return result;
                throw new TokenException(ResponseCodeEnum.TOKEN_INVALID.getCode(),
                        ResponseCodeEnum.TOKEN_INVALID.getMsg());
            }
            //校验token是否过期
            int tokenTime = Integer.parseInt(tokenArray[1]);
            if ((System.currentTimeMillis() / 1000) - tokenTime > validity_time) {
                result.put("code", timeout);
                result.put("msg", "登陆身份已过期,请重新登陆");
                return result;
            if (!redisTemplate.hasKey(token)) {
                throw new TokenException(ResponseCodeEnum.TOKEN_INVALID.getCode(),
                        ResponseCodeEnum.TOKEN_INVALID.getMsg());
            }
            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;
            return false;
        }
        return true;
    }
    //通过token获取用户信息
    public static Map<String, Object> getUserInfoByToken(String token) {
        Map<String, Object> userInfo = (Map<String, Object>) redisTemplate.opsForValue().get(token);
    /**
     * @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);
    }
}