package cn.com.goldenwater.dcproj.intercepter; import cn.com.goldenwater.dcproj.constValue.CommonLabel; import cn.com.goldenwater.dcproj.dto.LoginUser; import cn.com.goldenwater.dcproj.utils.JWTTokenUtil; import cn.com.goldenwater.dcproj.utils.ReturnUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.concurrent.TimeUnit; @Component public class LogInterceptor extends HandlerInterceptorAdapter { @Value("${intercept.enable}") public Boolean enterceptEnable; private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private RedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (enterceptEnable) { String persId = request.getHeader(CommonLabel.PERSID); String uuid=request.getHeader(CommonLabel.ACCESS_TOKEN); if(StringUtils.isBlank(uuid)){ ReturnUtils.responseFail(response,"accessToken error!!",9995); return false; } if (StringUtils.isNotBlank(persId)) { //有效期内 String accessToken= (String) redisTemplate.opsForValue().get(uuid); logger.info("source-->" + uuid + ":accessToken---->" + accessToken); if(accessToken==null||StringUtils.isBlank(accessToken)||"null".equals(accessToken)){ ReturnUtils.responseFail(response,"token认证失效,请退出重新登录",9999); logger.info(request.getRequestURI()+"--->9999"); return false; } LoginUser inspAllRlationPers = JWTTokenUtil.unsign(accessToken,persId); if(inspAllRlationPers!=null ){ if(!inspAllRlationPers.getPersId().equals(persId)){ ReturnUtils.responseFail(response,"信息存在被篡改嫌疑",9991); return false; } synchronized (this) { accessToken = JWTTokenUtil.sign(inspAllRlationPers, inspAllRlationPers.getPersId()); redisTemplate.opsForValue().set(uuid, accessToken, JWTTokenUtil.maxAge, TimeUnit.MILLISECONDS); redisTemplate.opsForValue().set(uuid+persId,accessToken,JWTTokenUtil.refreshmaxAge,TimeUnit.MILLISECONDS); } return true; } //过了有效期,刷新token inspAllRlationPers=JWTTokenUtil.getObject(accessToken,persId); if(inspAllRlationPers !=null){ ReturnUtils.responseFail(response,"accessToken过期,请重新刷新",9998); logger.info("token 已经过期,请重新刷新!!"); }else{ ReturnUtils.responseFail(response,"accessToken过期,请重新刷新",9996); logger.info("请退出重新登陆!!"); } } return false; } else { return true; } } }