package com.zy.asrs.wms.config; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
 | 
import com.zy.asrs.common.domain.enums.LoginSystemType; 
 | 
import com.zy.asrs.common.properties.SystemProperties; 
 | 
import com.zy.asrs.common.sys.entity.OperateLog; 
 | 
import com.zy.asrs.common.sys.entity.User; 
 | 
import com.zy.asrs.common.sys.entity.UserLogin; 
 | 
import com.zy.asrs.common.sys.service.OperateLogService; 
 | 
import com.zy.asrs.common.sys.service.UserLoginService; 
 | 
import com.zy.asrs.common.sys.service.UserService; 
 | 
import com.zy.asrs.common.utils.Http; 
 | 
import com.zy.asrs.framework.annotations.AppAuth; 
 | 
import com.zy.asrs.framework.annotations.ManagerAuth; 
 | 
import com.zy.asrs.framework.common.BaseRes; 
 | 
import com.zy.asrs.framework.common.Cools; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.lang.Nullable; 
 | 
import org.springframework.stereotype.Component; 
 | 
import org.springframework.web.method.HandlerMethod; 
 | 
import org.springframework.web.servlet.ModelAndView; 
 | 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
import java.lang.reflect.Method; 
 | 
import java.util.Date; 
 | 
  
 | 
/** 
 | 
 * Created by vincent on 2019-06-13 
 | 
 */ 
 | 
@Component 
 | 
public class AdminInterceptor extends HandlerInterceptorAdapter { 
 | 
  
 | 
    @Value("${super.pwd}") 
 | 
    private String superPwd; 
 | 
    @Autowired 
 | 
    private UserService userService; 
 | 
    @Autowired 
 | 
    private UserLoginService userLoginService; 
 | 
    @Autowired 
 | 
    private OperateLogService operateLogService; 
 | 
  
 | 
    @Override 
 | 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
 | 
        cors(response); 
 | 
        if (handler instanceof org.springframework.web.servlet.resource.ResourceHttpRequestHandler) { 
 | 
            return true; 
 | 
        } 
 | 
        // super账号 
 | 
        String token = request.getHeader("token"); 
 | 
        if (token!=null) { 
 | 
            String deToken = Cools.deTokn(token, superPwd); 
 | 
            if (deToken!=null){ 
 | 
                long timestamp = Long.parseLong(deToken.substring(0, 13)); 
 | 
                // 1天后过期 
 | 
                if (System.currentTimeMillis() - timestamp > 86400000){ 
 | 
                    Http.response(response, BaseRes.DENIED); 
 | 
                    return false; 
 | 
                } 
 | 
                if ("super".equals(deToken.substring(13))) { 
 | 
                    request.setAttribute("userId", 9527); 
 | 
                    return true; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        // 白名单 
 | 
//        if (IpTools.gainRealIp(request).equals("127.0.0.1")) { 
 | 
//            request.setAttribute("userId", 9527); 
 | 
//            return true; 
 | 
//        } 
 | 
        // 跨域设置 
 | 
        // response.setHeader("Access-Control-Allow-Origin", "*"); 
 | 
        HandlerMethod handlerMethod = (HandlerMethod) handler; 
 | 
        Method method = handlerMethod.getMethod(); 
 | 
        if (method.isAnnotationPresent(AppAuth.class)){ 
 | 
            AppAuth annotation = method.getAnnotation(AppAuth.class); 
 | 
            if (annotation.value().equals(AppAuth.Auth.CHECK)){ 
 | 
                request.setAttribute("appAuth", annotation.memo()); 
 | 
            } 
 | 
        } 
 | 
        if (method.isAnnotationPresent(ManagerAuth.class)){ 
 | 
            ManagerAuth annotation = method.getAnnotation(ManagerAuth.class); 
 | 
            if (annotation.value().equals(ManagerAuth.Auth.CHECK)){ 
 | 
                return check(request, response, annotation.memo()); 
 | 
            } 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) { 
 | 
        Object obj = request.getAttribute("operateLog"); 
 | 
        if (obj instanceof OperateLog) { 
 | 
            OperateLog operate = (OperateLog) obj; 
 | 
            operate.setResponse(String.valueOf(response.getStatus())); 
 | 
            operateLogService.save(operate); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { 
 | 
//        Object r = request.getAttribute("cool-response"); 
 | 
    } 
 | 
  
 | 
    private boolean check(HttpServletRequest request, HttpServletResponse response, String memo) { 
 | 
        try { 
 | 
            String token = request.getHeader("token"); 
 | 
            UserLogin userLogin = userLoginService.getOne(new LambdaQueryWrapper<UserLogin>().eq(UserLogin::getToken, token).eq(UserLogin::getSystem, String.valueOf(LoginSystemType.WMS))); 
 | 
            if (null == userLogin){ 
 | 
                Http.response(response, BaseRes.DENIED); 
 | 
                return false; 
 | 
            } 
 | 
            User user = userService.getById(userLogin.getUserId()); 
 | 
//            String deToken = Cools.deTokn(token, user.getPassword()); 
 | 
//            long timestamp = Long.parseLong(deToken.substring(0, 13)); 
 | 
            // 15分钟后过期 
 | 
            if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 900000){ 
 | 
                Http.response(response, BaseRes.DENIED); 
 | 
                return false; 
 | 
            } 
 | 
            // 请求缓存 
 | 
            request.setAttribute("userId", user.getId()); 
 | 
            request.setAttribute("hostId", userLogin.getHostId()); 
 | 
            // 更新 token 有效期 
 | 
            userLogin.setCreateTime(new Date()); 
 | 
            userLoginService.updateById(userLogin); 
 | 
            // 操作日志 
 | 
            if (!Cools.isEmpty(memo)) { 
 | 
                // 记录操作日志 
 | 
                OperateLog operateLog = new OperateLog(); 
 | 
                operateLog.setAction(Cools.isEmpty(memo)?request.getRequestURI():memo); 
 | 
                operateLog.setIp(request.getRemoteAddr()); 
 | 
                operateLog.setUserId(user.getId()); 
 | 
                operateLog.setRequest(JSON.toJSONString(request.getParameterMap())); 
 | 
                operateLog.setSystem(String.valueOf(LoginSystemType.WMS)); 
 | 
                request.setAttribute("operateLog", operateLog); 
 | 
            } 
 | 
            return true; 
 | 
        } catch (Exception e){ 
 | 
            Http.response(response, BaseRes.DENIED); 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 跨域 
 | 
     */ 
 | 
    public static void cors(HttpServletResponse response){ 
 | 
        // 跨域设置 
 | 
        response.setHeader("Access-Control-Allow-Origin", "*"); 
 | 
        response.setHeader("Access-Control-Allow-Credentials", "true"); 
 | 
        response.setHeader("Access-Control-Allow-Methods", "*"); 
 | 
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token"); 
 | 
        response.setHeader("Access-Control-Expose-Headers", "*"); 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |