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值。若小於,繼續執行調用的方法;若大於,不繼續執行調用的方法

 

此時,便可完成一個簡單的訪問頻率控制功能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM