kaiyu
2021-03-10 9e1e73064f54ac5c0ecebdbccfeff3e4267437e8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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<String, Object> getToken(String uid, Map<String, Object> userInfo) {
        Map<String, Object> 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<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<>();
        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<String, Object> getUserInfoByToken(String token) {
        Map<String, Object> userInfo = (Map<String, Object>) redisTemplate.opsForValue().get(token);
        return userInfo;
    }
}