package com.matrix.system.common.interceptor; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.fasterxml.jackson.databind.ObjectMapper; 
 | 
import com.matrix.component.redis.RedisClient; 
 | 
import com.matrix.component.redis.RedisUserLoginUtils; 
 | 
import com.matrix.core.constance.MatrixConstance; 
 | 
import com.matrix.core.pojo.AjaxResult; 
 | 
import com.matrix.core.tools.LogUtil; 
 | 
import com.matrix.core.tools.RSAUtils; 
 | 
import com.matrix.core.tools.StringUtils; 
 | 
import com.matrix.system.common.bean.SysUsers; 
 | 
import com.matrix.system.common.dao.SysUsersDao; 
 | 
import com.matrix.system.hive.bean.SysVipInfo; 
 | 
import com.matrix.system.hive.dao.SysVipInfoDao; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.stereotype.Component; 
 | 
import org.springframework.web.servlet.HandlerInterceptor; 
 | 
import org.springframework.web.servlet.ModelAndView; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
  
 | 
/** 
 | 
 * @author wzy 
 | 
 * @date 2020-12-21 
 | 
 **/ 
 | 
@Component 
 | 
public class ApiUserLoginInterceptor implements HandlerInterceptor { 
 | 
  
 | 
    @Autowired 
 | 
    private RedisClient redisClient; 
 | 
  
 | 
    @Value("${login_private_key}") 
 | 
    private String privateKey; 
 | 
  
 | 
    @Value("${evn}") 
 | 
    private String evn; 
 | 
  
 | 
    @Autowired 
 | 
    private SysUsersDao sysUsersDao; 
 | 
  
 | 
    private final String TOKEN_HEADER = "Authorization"; 
 | 
    private final String TOKEN_START_WITH = "Bearer "; 
 | 
  
 | 
    @Override 
 | 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
 | 
        if ("dev".equals(evn)) { 
 | 
            SysUsers sysUsers = sysUsersDao.selectById(1012L); 
 | 
            request.getSession().setAttribute(MatrixConstance.LOGIN_KEY, sysUsers); 
 | 
            return true; 
 | 
        } 
 | 
  
 | 
        String token = resolveToken(request); 
 | 
        AjaxResult ajaxResult = new AjaxResult(); 
 | 
        ajaxResult.setStatus(AjaxResult.STATUS_LOGIN_INVALID); 
 | 
  
 | 
        response.setCharacterEncoding("UTF-8"); 
 | 
        response.setContentType("application/json; charset=utf-8"); 
 | 
        if (StringUtils.isBlank(token)) { 
 | 
            ajaxResult.setInfo("login time out"); 
 | 
            response.getWriter().write(new ObjectMapper().writeValueAsString(ajaxResult)); 
 | 
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        String userStr = redisClient.getCachedValue(token); 
 | 
//        redisClient.resetExpire(token); 
 | 
        if (StringUtils.isBlank(userStr)) { 
 | 
            ajaxResult.setInfo("login time out"); 
 | 
            response.getWriter().write(new ObjectMapper().writeValueAsString(ajaxResult)); 
 | 
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        SysUsers sysUsers = JSONObject.parseObject(userStr, SysUsers.class); 
 | 
        request.getSession().setAttribute(MatrixConstance.LOGIN_KEY, sysUsers); 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
 | 
        request.getSession().removeAttribute(MatrixConstance.LOGIN_KEY); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解析token  token_timestamp_url 
 | 
     * 
 | 
     * @param request 
 | 
     * @return 
 | 
     */ 
 | 
    private String resolveToken(HttpServletRequest request) { 
 | 
        String headToken = request.getHeader(TOKEN_HEADER); 
 | 
        String sb = request.getRequestURI(); 
 | 
  
 | 
        if (StringUtils.isNotBlank(headToken) && headToken.startsWith(TOKEN_START_WITH)) { 
 | 
            // 去掉令牌前缀 
 | 
            String rsaToken = headToken.replace(TOKEN_START_WITH, ""); 
 | 
  
 | 
            try { 
 | 
                String decryptToken = new String(RSAUtils.decryptByPrivateKey(rsaToken, privateKey)); 
 | 
  
 | 
                String[] s = decryptToken.split("_"); 
 | 
                if (s == null || s.length != 3) { 
 | 
                    return ""; 
 | 
                } 
 | 
  
 | 
                LogUtil.info("请求路径:{} -- {}", sb, s[2]); 
 | 
                if (!sb.equals(s[2])) { 
 | 
                    return ""; 
 | 
                } 
 | 
  
 | 
                return s[0]; 
 | 
            } catch (Exception e) { 
 | 
                LogUtil.info("#token解析错误:{}#", e); 
 | 
                return ""; 
 | 
            } 
 | 
  
 | 
        } 
 | 
  
 | 
        return ""; 
 | 
    } 
 | 
} 
 |