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;
|
}
|
|
}
|