package com.zbkj.common.token;
|
|
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.utils.RequestUtil;
|
import com.zbkj.common.vo.LoginUserVo;
|
import org.apache.commons.lang3.ArrayUtils;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Objects;
|
import java.util.UUID;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* token验证处理
|
*/
|
@Component
|
public class FrontTokenComponent {
|
|
@Resource
|
private RedisUtil redisUtil;
|
|
private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
|
|
private static final Long MILLIS_MINUTE = 60 * 1000L;
|
|
// 令牌有效期(默认30分钟) todo 调试期改为5小时
|
// private static final int expireTime = 30;
|
private static final int expireTime = 5 * 60;
|
|
/**
|
* 获取用户身份信息
|
*
|
* @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);
|
}
|
}
|
|
/**
|
* 验证令牌有效期,相差不足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
|
*/
|
public String getToken(HttpServletRequest request) {
|
String token = request.getHeader(Constants.HEADER_AUTHORIZATION_KEY);
|
if (StrUtil.isNotEmpty(token) && token.startsWith(Constants.USER_TOKEN_REDIS_KEY_PREFIX)) {
|
token = token.replace(Constants.USER_TOKEN_REDIS_KEY_PREFIX, "");
|
}
|
return token;
|
}
|
|
private String getTokenKey(String uuid) {
|
return Constants.USER_TOKEN_REDIS_KEY_PREFIX + uuid;
|
}
|
|
/**
|
* 推出登录
|
* @param request HttpServletRequest
|
*/
|
public void logout(HttpServletRequest request) {
|
String token = getToken(request);
|
delLoginUser(token);
|
}
|
|
/**
|
* 获取当前登录用户id
|
*/
|
public Integer getUserId() {
|
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
String token = getToken(request);
|
if (StrUtil.isEmpty(token)) {
|
return null;
|
}
|
return redisUtil.get(getTokenKey(token));
|
}
|
|
//路由在此处,则返回true,无论用户是否登录都可以访问
|
public boolean checkRouter(String uri) {
|
String[] routerList = {
|
"api/front/product/detail",
|
"api/front/coupons",
|
"api/front/index",
|
"api/front/bargain/list",
|
"api/front/combination/list",
|
"api/front/index/product",
|
"api/front/combination/index",
|
"api/front/bargain/index",
|
"api/front/index/color/config",
|
"api/front/product/list",
|
"api/front/product/sku/detail",
|
"api/front/index/get/version",
|
"api/front/image/domain",
|
"api/front/product/leaderboard"
|
};
|
|
return ArrayUtils.contains(routerList, uri);
|
}
|
|
public Boolean check(String token, HttpServletRequest request){
|
|
try {
|
boolean exists = redisUtil.exists(getTokenKey(token));
|
if(exists){
|
Integer uid = redisUtil.get(getTokenKey(token));
|
redisUtil.set(getTokenKey(token), uid, Constants.TOKEN_EXPRESS_MINUTES, TimeUnit.MINUTES);
|
}else{
|
//判断路由,部分路由不管用户是否登录/token过期都可以访问
|
exists = checkRouter(RequestUtil.getUri(request));
|
}
|
return exists;
|
}catch (Exception e){
|
return false;
|
}
|
}
|
}
|