package cn.com.goldenwater.dcproj.intercepter; import cn.com.goldenwater.dcproj.utils.ReturnUtils; import cn.com.goldenwater.dcproj.utils.UserMsgSectrityUtils; 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 PathVariableInterceptor 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 phone=request.getParameter("phone"); if(StringUtils.isBlank(phone) && !UserMsgSectrityUtils.isMobileNO(phone)){ ReturnUtils.responseFail(response,"手机号信息不能为空",9991); return false; } String blackIp= (String) redisTemplate.opsForValue().get("blackList:"+phone); if(phone.equals(blackIp)){ ReturnUtils.responseFail(response,"检测到该手机号登录过于频繁,可能存在恶意操作,系统已将手机用户暂时列入黑名单,如果疑问,请1小时后再试!",9991); return false; } long startTime= redisTemplate.opsForValue().get(phone+"_time")==null?0L: Long.valueOf(redisTemplate.opsForValue().get(phone+"_time")+""); if(startTime==0L){ redisTemplate.opsForValue().set(phone+"_time",System.currentTimeMillis()); redisTemplate.opsForValue().set(phone+"_login_count",1); }else{ int count= redisTemplate.opsForValue().get(phone+"_login_count")==null?0: (int) redisTemplate.opsForValue().get(phone+"_login_count"); if(count<20){ count=count+1; redisTemplate.opsForValue().set(phone+"_login_count",count); }else{ long time=(System.currentTimeMillis()-startTime)/3600000L; if(time>1){ redisTemplate.opsForValue().set(phone+"_login_count",0); redisTemplate.opsForValue().set(phone+"_time",0L); }else{ redisTemplate.opsForValue().set("blackList:"+phone,phone,3600000L,TimeUnit.MILLISECONDS); ReturnUtils.responseFail(response,"检测到该手机号登录过于频繁,可能存在恶意操作,系统已将手机用户暂时列入黑名单,如果疑问,请1小时后再试!",9991); return false; } } } } return true; } }