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清除登录信息,
* 系统能通知终端刷新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; } }