package cn.com.goldenwater.dcproj.intercepter; import cn.com.goldenwater.dcproj.constValue.CommonLabel; import cn.com.goldenwater.dcproj.utils.ReturnUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.concurrent.TimeUnit; /** * Created by jinshui on 2020/1/19. */ public class PathInterceptor extends HandlerInterceptorAdapter { @Value("${intercept.enable}") public Boolean enterceptEnable; @Autowired private RedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (enterceptEnable) { String accessToken = request.getHeader(CommonLabel.ACCESS_TOKEN); if (StringUtils.isBlank(accessToken)) { return true; } String methodName = ((HandlerMethod)handler).getMethod().getName(); if (StringUtils.isBlank(methodName)) { return true; } String key = accessToken + methodName; Object value = redisTemplate.opsForValue().get(key); if (value == null) { redisTemplate.opsForValue().set(key, 1, 60000, TimeUnit.MILLISECONDS); return true; } Integer intValue = Integer.valueOf(String.valueOf(value)); if (intValue == null) { redisTemplate.opsForValue().set(key, 1, 60000, TimeUnit.MILLISECONDS); return true; } if (intValue.intValue() < 100) { redisTemplate.boundValueOps(key).increment(1); return true; } ReturnUtils.responseFail(response,"检测到该接口请求频繁,可能存在恶意操作,系统已将该IP地址暂时列入黑名单,如果疑问,请一分钟后再试!",9991); return false; } return true; } }