package cc.mrbird.febs.common.interceptor;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.utils.AppContants;
|
import cc.mrbird.febs.common.utils.RedisUtils;
|
import cc.mrbird.febs.common.utils.SpringContextUtil;
|
import cc.mrbird.febs.mall.entity.MallMember;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.crypto.asymmetric.KeyType;
|
import cn.hutool.crypto.asymmetric.RSA;
|
import com.alibaba.fastjson.JSON;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.ModelAndView;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
|
/**
|
* @author xxx
|
* @date 2020-08-24
|
**/
|
@Slf4j
|
public class LoginInterceptor implements HandlerInterceptor {
|
|
private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class);
|
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
String headerToken = request.getHeader("token");
|
if (StringUtils.isBlank(headerToken)) {
|
responseUnAuth(response);
|
return false;
|
}
|
|
// String token = resolveToken(headerToken);
|
RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
|
String token = rsa.decryptStr(headerToken, KeyType.PrivateKey);
|
|
if (token == null || AppContants.TIME_OUT.equals(token)) {
|
responseUnAuth(response);
|
return false;
|
}
|
|
String userJsonStr = redisUtils.getString(token);
|
if (StringUtils.isBlank(userJsonStr)) {
|
responseUnAuth(response);
|
return false;
|
}
|
MallMember member = JSON.parseObject(userJsonStr, MallMember.class);
|
|
request.getSession().setAttribute("member", member);
|
return true;
|
}
|
|
@Override
|
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
|
|
}
|
|
@Override
|
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
|
}
|
|
private void responseUnAuth(HttpServletResponse response) throws IOException {
|
response.setCharacterEncoding("UTF-8");
|
response.setContentType("application/json; charset=utf-8");
|
response.getWriter().write(new ObjectMapper().writeValueAsString(new FebsResponse().code(HttpStatus.UNAUTHORIZED)));
|
}
|
|
private String resolveToken(String token) {
|
try {
|
RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
|
String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_");
|
if (verifyTokenExpired(Long.parseLong(tokens[1]))) {
|
return tokens[0];
|
} else {
|
return AppContants.TIME_OUT;
|
}
|
} catch (Exception e) {
|
log.error("#解析token异常#", e);
|
return null;
|
}
|
}
|
|
private Boolean verifyTokenExpired(Long time) {
|
boolean isDebug = true;
|
if (!isDebug) {
|
long currentTime = System.currentTimeMillis();
|
return currentTime - time <= 30000;
|
}
|
return true;
|
}
|
|
}
|