jinpengyong
2023-11-10 c8cc61e84189d8f986f7c4657d543408021b3da0
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
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);
    }
}