package com.zbkj.admin.filter; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.zbkj.common.constants.Constants; import com.zbkj.common.utils.RedisUtil; import com.zbkj.common.vo.LoginUserVo; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * token验证处理 */ @Component public class TokenComponent { @Resource private RedisUtil redisUtil; private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; private static final Long MILLIS_MINUTE = 60 * 1000L; // 令牌有效期(默认30分钟) todo 调试期改为24小时 // private static final int expireTime = 30; private static final int expireTime = 30 * 24 * 60; // Redis 存储的key private static final String TOKEN_REDIS = "TOKEN:ADMIN:"; /** * 获取用户身份信息 * * @return 用户信息 */ public LoginUserVo getLoginUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = getToken(request); if (StrUtil.isNotEmpty(token)) { String userKey = getTokenKey(token); return redisUtil.get(userKey); } return null; } /** * 设置用户身份信息 */ public void setLoginUser(LoginUserVo loginUser) { if (ObjectUtil.isNotNull(loginUser) && StrUtil.isNotEmpty(loginUser.getToken())) { refreshToken(loginUser); } } /** * 删除用户身份信息 */ public void delLoginUser(String token) { if (StrUtil.isNotEmpty(token)) { String userKey = getTokenKey(token); redisUtil.delete(userKey); } } /** * 创建令牌 * * @param loginUser 用户信息 * @return 令牌 */ public String createToken(LoginUserVo loginUser) { String token = UUID.randomUUID().toString().replace("-", ""); loginUser.setToken(token); // setUserAgent(loginUser); refreshToken(loginUser); return token; } /** * 验证令牌有效期,相差不足20分钟,自动刷新缓存 * * @param loginUser LoginUserVo */ public void verifyToken(LoginUserVo loginUser) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { refreshToken(loginUser); } } /** * 刷新令牌有效期 * * @param loginUser 登录信息 */ public void refreshToken(LoginUserVo loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 String userKey = getTokenKey(loginUser.getToken()); redisUtil.set(userKey, loginUser, (long) expireTime, TimeUnit.MINUTES); } /** * 获取请求token * * @param request HttpServletRequest * @return token */ private String getToken(HttpServletRequest request) { String token = request.getHeader(Constants.HEADER_AUTHORIZATION_KEY); if (StrUtil.isNotEmpty(token) && token.startsWith(TOKEN_REDIS)) { token = token.replace(TOKEN_REDIS, ""); } return token; } private String getTokenKey(String uuid) { return TOKEN_REDIS + uuid; } }