無論是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值。若小於,繼續執行調用的方法;若大於,不繼續執行調用的方法。
此時,便可完成一個簡單的訪問頻率控制功能。