当前位置:   article > 正文

springboot 接口频率限制_springboot接口频率限制

springboot接口频率限制

1.使用场景

      针对耗时操作的接口,避免在短时间内重复请求,在后端用拦截器对请求进行拦截过滤,判断请求频率是否在合理时间范围内。

2.实现方式

 

  1. @Component
  2. public class RequestFrequenceInterceptor implements HandlerInterceptor {
  3. private static Logger log = LoggerFactory.getLogger( RequestFrequenceInterceptor.class );
  4. private long lastTime = 0;
  5. private boolean startDelay(int time) {
  6. long currentTime = System.currentTimeMillis();
  7. if (currentTime - lastTime > time) {
  8. System.out.println(currentTime + " - " + lastTime);
  9. lastTime = currentTime;
  10. return true;
  11. }
  12. return false;
  13. }
  14. @Override
  15. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  16. String ip = CommontMethod.getIpAddr( request );//获取ip地址
  17. //开始进入请求地址拦截
  18. //获取执行方法上的注解 不过滤静态资源
  19. if(handler instanceof HandlerMethod){
  20. HandlerMethod hm = (HandlerMethod) handler;
  21. //对包含注解的方法进行频率验证
  22. Delay delay = hm.getMethodAnnotation(Delay.class);
  23. if (delay != null) {
  24. if ( startDelay(delay.time()))
  25. {
  26. return true;
  27. }else {
  28. log.warn( ip+" 请求频率过快" );
  29. Map<String,Object> responseMap = new HashMap<>( );
  30. responseMap.put( "code", SystemCode.LOCK_USER.getCode() );
  31. responseMap.put( "message","请求被锁定,频率过快" );
  32. String resStr = JsonUtil.toJsonStr(responseMap);
  33. response.setContentType("application/json;charset=utf-8");
  34. response.setHeader("Access-Control-Allow-Origin", "*");
  35. response.setHeader("Cache-Control","no-cache");
  36. response.getWriter().write(resStr);
  37. return false;
  38. }
  39. }
  40. }
  41. // 对于不包含注解的方法一律放行
  42. return true;
  43. }
  44. @Override
  45. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
  46. //处理请求完成后紧接着的操作
  47. }
  48. @Override
  49. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
  50. //视图渲染之后的操作
  51. }
  52. }

 2.自定义时间注解

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Component
  4. public @interface Delay {
  5. //默认两秒,意思是每个方法两秒内只能请求一次,重复请求无效
  6. int time() default 2000;
  7. }

3.注册拦截器

  1. @Configuration
  2. public class RequestParamInterceptorConf implements WebMvcConfigurer {
  3. @Autowired
  4. RequestParamInterceptor requestParamInterceptor;
  5. @Autowired
  6. RequestFrequenceInterceptor frequenceInterceptor;
  7. @Override
  8. public void addInterceptors(InterceptorRegistry registry){
  9. // 多个拦截器组成一个拦截器链
  10. // addPathPatterns 用于添加拦截规则
  11. // excludePathPatterns 用户排除拦截
  12. // TokenInterceptor()为自己定义的拦截器
  13. registry.addInterceptor(requestParamInterceptor).addPathPatterns("/**").excludePathPatterns("/error");
  14. registry.addInterceptor( frequenceInterceptor ).addPathPatterns( "/**" ).excludePathPatterns("/error");
  15. }
  16. }

4.获取请求ip小工具

  1. public class CommontMethod {
  2. /**
  3. * 获取请求ip
  4. * @param request
  5. * @return
  6. */
  7. public static String getIpAddr(HttpServletRequest request){
  8. String ipAddress = request.getHeader("x-forwarded-for");
  9. if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  10. ipAddress = request.getHeader("Proxy-Client-IP");
  11. }
  12. if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  13. ipAddress = request.getHeader("WL-Proxy-Client-IP");
  14. }
  15. if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  16. ipAddress = request.getRemoteAddr();
  17. if("127.0.0.1".equals(ipAddress) || "0:0:0:0:0:0:0:1".equals(ipAddress)){
  18. //根据网卡取本机配置的IP
  19. InetAddress inet=null;
  20. try {
  21. inet = InetAddress.getLocalHost();
  22. } catch (UnknownHostException e) {
  23. e.printStackTrace();
  24. }
  25. ipAddress= inet.getHostAddress();
  26. }
  27. }
  28. //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  29. if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
  30. if(ipAddress.indexOf(",")>0){
  31. ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
  32. }
  33. }
  34. return ipAddress;
  35. }
  36. }

 

总结:要使用该注解,直接在要使用的方法上@Dely(value=5000)即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/874263
推荐阅读
相关标签
  

闽ICP备14008679号