限制介面的訪問次數

2022-07-22 10:48:23 字數 2008 閱讀 1224

情景:傳送手機驗證碼或者郵箱驗證碼時限制規則:一分鐘只可以發一次,一天內也有次數限制。以防止惡意訪問,降低伺服器壓力。

解決思路:獲取使用者ip位址,判斷此ip是否首次訪問,如果是首次訪問,在redis建立minkey,daykey.並設定minkey過期60s,daykey為86400s,也就是24h。首次訪問則次數加一。超過1次或一天超過限制次數時,禁止訪問。

1.獲取使用者真實ip位址。

/**

* 自定義訪問物件工具類

* 獲取物件的ip位址等資訊 */

public

class

getipaddressutil

if (ip == null || ip.length() == 0 || "unknown".equalsignorecase(ip))

if (ip == null || ip.length() == 0 || "unknown".equalsignorecase(ip))

if (ip == null || ip.length() == 0 || "unknown".equalsignorecase(ip))

if (ip == null || ip.length() == 0 || "unknown".equalsignorecase(ip))

} else

if (ip.length() > 15) }}

return

ip; }

}

2.redis配置

public

class

myjedispool

catch

(exception e)

} /**獲得jedis物件

*/public

static

jedis getjedisobject()

/**歸還jedis物件

*/public

static

void

returnjedisojbect(jedis jedis)

}}

3.操作redis完成次數限制

string useripaddr =getipaddressutil.getipinfo(request);

jedis jedis = myjedispool.getjedisobject();//

獲取jedis鏈結物件

boolean flag = true

;

flag =limitsendcount(useripaddr,jedis);

system.out.println(flag);

//根據flag判斷是否超出限制

if (jedis != null

)

//判斷是否超出限制

public

boolean

limitsendcount(string ip, jedis jedis) else

}return

true

; }

else

jedis.incr(ip+"minlimte");

jedis.incr(ip+"daylimte");

}

return

true

; }

4.以上後端驗證次數已完成。如果前後不分離,前端需要在點選按鈕後禁止點選,按鈕顯示倒計時直至為0s方可再次點選時,前端js如下:

//

傳送成功後60秒內不可再次傳送

var id = 60;

//定時執行

var timeing = setinterval(function

() , 1000);

//延遲執行

window.settimeout(function

() , 60000);

介面限流 限制介面的訪問頻率

限流,顧名思義,就是限制對 api 的呼叫頻率。每一次 api 呼叫,都要花費伺服器的資源,因此很多 api 不會對使用者無限次地開放,請求達到某個次數後就不再允許訪問了,或者一段時間內,最多隻允許訪問 api 指定次數。目前,我們的介面是沒有任何限流措施的,只要使用者呼叫介面,伺服器就會處理並返回...

Redis限制訪問次數

redis可以很方便的實現短期的資料儲存和使用。比如限制一段時間內的訪問次數之類的,如果用關係型資料庫來做稍顯麻煩,這裡用剛剛寫的新需求做個小例子。需求 一分鐘內訪問超過3次,提示請稍候 通過快取查詢身份證在一分鐘內的刷卡次數 param idcard 身份證號 return public intc...

第 14 篇 限制介面的訪問頻率

限流,顧名思義,就是限制對 api 的呼叫頻率。每一次 api 呼叫,都要花費伺服器的資源,因此很多 api 不會對使用者無限次地開放,請求達到某個次數後就不再允許訪問了,或者一段時間內,最多隻允許訪問 api 指定次數。目前,我們的介面是沒有任何限流措施的,只要使用者呼叫介面,伺服器就會處理並返回...