41589b4ff7963fd685d103f02c69143d77bad956.svn-base 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package cn.com.goldenwater.dcproj.intercepter;
  2. import cn.com.goldenwater.dcproj.constValue.CommonLabel;
  3. import cn.com.goldenwater.dcproj.utils.ReturnUtils;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import org.springframework.web.method.HandlerMethod;
  9. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.util.concurrent.TimeUnit;
  13. /**
  14. * Created by jinshui on 2020/1/19.
  15. */
  16. public class PathInterceptor extends HandlerInterceptorAdapter {
  17. @Value("${intercept.enable}")
  18. public Boolean enterceptEnable;
  19. @Autowired
  20. private RedisTemplate redisTemplate;
  21. @Override
  22. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  23. if (enterceptEnable) {
  24. String accessToken = request.getHeader(CommonLabel.ACCESS_TOKEN);
  25. if (StringUtils.isBlank(accessToken)) {
  26. return true;
  27. }
  28. String methodName = ((HandlerMethod)handler).getMethod().getName();
  29. if (StringUtils.isBlank(methodName)) {
  30. return true;
  31. }
  32. String key = accessToken + methodName;
  33. Object value = redisTemplate.opsForValue().get(key);
  34. if (value == null) {
  35. redisTemplate.opsForValue().set(key, 1, 60000, TimeUnit.MILLISECONDS);
  36. return true;
  37. }
  38. Integer intValue = Integer.valueOf(String.valueOf(value));
  39. if (intValue == null) {
  40. redisTemplate.opsForValue().set(key, 1, 60000, TimeUnit.MILLISECONDS);
  41. return true;
  42. }
  43. if (intValue.intValue() < 100) {
  44. redisTemplate.boundValueOps(key).increment(1);
  45. return true;
  46. }
  47. ReturnUtils.responseFail(response,"检测到该接口请求频繁,可能存在恶意操作,系统已将该IP地址暂时列入黑名单,如果疑问,请一分钟后再试!",9991);
  48. return false;
  49. }
  50. return true;
  51. }
  52. }