shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
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
package com.iplatform.base.util;
 
import com.iplatform.base.VariableConstants;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.web.Constants;
import com.walker.web.TokenGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import javax.servlet.http.HttpServletRequest;
 
public class TokenUtils {
 
    private static final transient Logger logger = LoggerFactory.getLogger(TokenUtils.class);
 
    private static final long SECONDS_FOR_ONE_MINUTE = 60;
 
//    private static final long MINUTE_FOR_TOKEN_REFRESH_LEFT = 10;   // token剩余10分钟时提示前端刷新token
 
    /**
     * 缓存登录分钟数,应当比token时间少几分钟(默认5),这样保证token失效前,redis清除登录信息,<br>
     * 系统能通知终端刷新token。
     * @date 2022-11-15
     */
    private static final long MINUTE_FOR_CACHE_LOGIN_LESS = 5;
 
    /**
     * 生成一个token,统一方法调用,业务都调用该方法。
     * @param userId 用户ID
     * @param loginId 用户登录名
     * @param uuid 生成的随机数
     * @param tokenGenerator
     * @param expiredMinutes 失效分钟数
     * @return
     * @date 2022-11-15
     * @date 2023-03-28 添加失效时间参数: expiredMinutes
     */
    public static final String generateToken(String userId
            , String loginId, String uuid, TokenGenerator tokenGenerator, long expiredMinutes){
        StringBuilder tokenData = new StringBuilder(userId);
        tokenData.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
        tokenData.append(loginId);
        return tokenGenerator.createToken(uuid, tokenData.toString()
//                , VariableConstants.DEFAULT_TOKEN_EXPIRED_MINUTES
                , expiredMinutes
                , VariableConstants.TOKEN_SECRET);
    }
 
//    /**
//     * 判断是否重新获取(刷新)token
//     * @param tokenExpiredMinutes 配置的token过期时间(分钟)
//     * @param tokenCreateMills token创建毫秒值
//     * @return
//     * @date 2022-11-14
//     */
//    public static final boolean isTokenRefresh(long tokenExpiredMinutes, long tokenCreateMills){
//        long currentTime = System.currentTimeMillis();
//        if(currentTime < tokenCreateMills){
//            logger.error("当前时间不能大于 'tokenCreateMills'");
//            return false;
//        }
//        long durationSeconds = (currentTime - tokenCreateMills) / 1000;
//        long tokenExpiredLeftMinute = tokenExpiredMinutes - durationSeconds/60;
//        if(tokenExpiredLeftMinute <= 0){
//            logger.warn("token已经过期,无需'refreshToken'");
//            return false;
//        }
//        if(tokenExpiredLeftMinute < MINUTE_FOR_TOKEN_REFRESH_LEFT){
//            return true;
//        }
//        return false;
//    }
 
    /**
     * 获得缓存用户的过期时间,该时间要比token生成过期时间略长(5分钟)。
     * @param tokenExpiredMinutes token过期分钟数
     * @return 返回缓存用户时间(秒)
     * @date 2022-11-14
     */
    public static final long acquireCacheUserExpiredSeconds(long tokenExpiredMinutes){
        if(tokenExpiredMinutes <= 0){
            throw new IllegalArgumentException("tokenExpiredMinutes 必须大于0");
        }
        if(tokenExpiredMinutes < MINUTE_FOR_CACHE_LOGIN_LESS){
            throw new IllegalArgumentException("设置的token失效时间(分钟)过短:" + tokenExpiredMinutes + ", 请重新设置。");
        }
        return (tokenExpiredMinutes - MINUTE_FOR_CACHE_LOGIN_LESS) * SECONDS_FOR_ONE_MINUTE;
    }
 
    /**
     * 返回token中业务数据,用户缓存的key,以及用户ID + 登录ID(2022-11-15追加)
     * @param tokenData
     * @return array[0] = user_id, array[1] = login_id, array[2] = user_key
     */
    public static final String[] getUserIdAndKey(String tokenData){
        if(StringUtils.isEmpty(tokenData)){
            return null;
        }
        return tokenData.split(StringUtils.DEFAULT_SPLIT_SEPARATOR);
    }
 
    public static final String getAuthorizationToken(HttpServletRequest request){
        // Constants.TOKEN_HEADER
        return getAuthorizationToken(request, Constants.TOKEN_HEADER);
    }
 
    /**
     * 从HTTP请求中获取授权token,默认token名字:Authorization
     * @param request
     * @param tokenName token名字
     * @return
     * @author 时克英
     * @date 2022-11-02
     */
    public static final String getAuthorizationToken(HttpServletRequest request, String tokenName){
        String token = request.getHeader(tokenName);
        if(StringUtils.isEmpty(token)){
            // 如果header中不存在,就在参数中查找
            token = request.getParameter(tokenName);
        }
        if(StringUtils.isEmpty(token)){
            return null;
        }
        if(token.startsWith(Constants.TOKEN_PREFIX)){
            token = token.replace(Constants.TOKEN_PREFIX, StringUtils.EMPTY_STRING);
        }
        return token;
    }
 
}