package com.xzx.gc.interceptor; import com.xzx.gc.common.annotations.PassToken; import com.xzx.gc.common.constant.RedisKeyConstant; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.LogUtils; import com.xzx.gc.common.utils.RedisUtil; import com.xzx.gc.common.utils.SpringUtil; import com.xzx.gc.entity.CoreUser; import com.xzx.gc.model.ExceptionEnum; import com.xzx.gc.model.MiException; import com.xzx.gc.util.SessionUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; @Component @Slf4j public class SessionInterceptor implements HandlerInterceptor{ @Autowired private RedisUtil redisUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { String sessionId=request.getSession().getId(); // log.debug("进行SESSION拦截器:{},{}",sessionId,request.getRequestURI()); if(SpringUtil.isDev()&&"true".equals(request.getHeader("swagger"))){ return true; } // 如果不是映射到方法直接通过或者是否有passtoken注释,有则跳过认证 if (!(o instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) o; Method method = handlerMethod.getMethod(); if(method.getName().equals("dataEchart")){ return true; } if(method.getName().equals("queryListMap")){ return true; } if (method.isAnnotationPresent(PassToken.class)) { PassToken passToken = method.getAnnotation(PassToken.class); if (passToken.required()) { return true; } } //验证session是否存在 Object obj = request.getSession().getAttribute(SessionUtil.ACCESS_CURRENT_USER); Object obj2 = request.getSession().getAttribute(SessionUtil.ACCESS_CURRENT_ORG); if(obj == null||obj2==null){ throw new MiException(ExceptionEnum.DATABASE_EXCEPTION); } CoreUser user= (CoreUser) obj; Long userId=user.getId(); if(SpringUtil.isProdOrCloud()) { String oldSessionId = redisUtil.get(RedisKeyConstant.USER_SESSION_KEY + userId); if (!sessionId.equals(oldSessionId)) { throw new RestException(-2, "您的登录已经过期,请重新登录"); } } LogUtils.setTraceId(LogUtils.TRACE_USER_ID,userId==null?"匿名":userId+""); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { LogUtils.clearTraceId(); } }