web系统访问频率限制

Posted MAHUAN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web系统访问频率限制相关的知识,希望对你有一定的参考价值。

无论是spring mvc还是struts,都可以为controller或者aciton执行前,增加拦截器。

通过拦截器中的逻辑控制,可以实现访问频率的限制。

首先构造访问频率数据类

class FrequencyData {
    // 使用ip_methodName
    String        key;
    // 记录开始时间
    long        startTime;
    // 记录结束时间
    long        endTime;
    // 访问频率限制时间长度
    int            time;
    // 访问频率限制次数
    int            limit;
    // 记录访问时间点
    List<Long>    accessPoints    = new ArrayList<Long>();

    public void reset(long time) {
        startTime = endTime = time;
        accessPoints.clear();
        accessPoints.add(time);
    }
}

在spring mvc的拦截器中,可以获取到拦截的方法名,并通过request获取到客户端的IP地址。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    ((HandlerMethod) handler).getMethod().getName();
    ((HandlerMethod) handler).getBean().getClass().getName();
  request.getRemoteAddr() ..... }

在拦截器类中建立一个保存每个客户端访问记录的Map数据

private static Map<String, FrequencyData>    FreqDatas            = new HashMap<String, FrequencyData>(MAX_SIZE);

访问频率限制执行流程如下:

1、计算key值,即为ip_methodName,获取对应的FrequencyData。

2、如果FrequencyData数据不存在,新建并保存到FreqDatas中。

3、FrequencyData数据中的time和limit可固定写死,也可通过注解获取(在被调用的方法上,增加自定义的注解,注解中指定两个参数)。

4、在FrequencyData数据的accessPoints中增加一个记录,并更新endTime时间。

5、计算endTime-startTime是否大于time值。如果大于,执行FrequencyData的reset()。

6、计算accessPoints.size()是否大于limit值。若小于,继续执行调用的方法;若大于,不继续执行调用的方法

 

此时,便可完成一个简单的访问频率控制功能。

 


以上是关于web系统访问频率限制的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot限制接口访问频率

laravel 频率限制throttle

nginx配置限制同一个ip的访问频率

秒杀系统之「抢购接口隐藏」 + 「单用户限制频率」

nginx lua redis 访问频率限制(转)

访问控制与鉴权设计