情景:傳送手機驗證碼或者郵箱驗證碼時限制規則:一分鐘只可以發一次,一天內也有次數限制。以防止惡意訪問,降低伺服器壓力。
解決思路:獲取使用者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配置
publicclass
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 指定次數。目前,我們的介面是沒有任何限流措施的,只要使用者呼叫介面,伺服器就會處理並返回...