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 {  
 | 
        if ("OPTIONS".equals(request.getMethod().toUpperCase())) {  
 | 
            return true;  
 | 
        }  
 | 
        String headerToken = request.getHeader("token");  
 | 
        if (StringUtils.isBlank(headerToken)) {  
 | 
            responseUnAuth(response);  
 | 
            return false;  
 | 
        }  
 | 
  
 | 
        String token = resolveToken(headerToken);  
 | 
        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;  
 | 
    }  
 | 
}  
 |