防刷介面的實現
阿新 • • 發佈:2018-12-15
這是小編在某生鮮第一的電商網際網路公司的防刷介面,大家可以研究研究。
/** * 判斷惡意攻擊. * * @param redisKey 判斷依據 * @param defenseRatio 桶內最大數量 * @param reqMaxTimes 桶的事件間隔 * @return true 頻率高,false 頻率底 */ @Override public boolean checkDefenseLogin(String redisKey, int defenseRatio, int reqMaxTimes) { Object checkedValue = antispamUserMainCacheManger.get(redisKey); if (checkedValue == null) { //記錄當前第一次請求 antispamUserMainCacheManger.set(redisKey, String.format("%s_%s", 1, System.currentTimeMillis()), defenseRatio + 1); } else { //已經校驗過 String[] values = checkedValue.toString().split("_"); //請求次數 int requestTimes = TypeUtils.castToInt(values[0]); //請求時間config long creaTime = TypeUtils.castToLong(values[1]); if ((System.currentTimeMillis() - creaTime) >= (defenseRatio * 1000)) { antispamUserMainCacheManger.del(redisKey); } else { if (requestTimes + 1 >= reqMaxTimes) { antispamUserMainCacheManger.del(redisKey); //當前請求是攻擊請求 return true; } else { antispamUserMainCacheManger.set(redisKey, String.format("%s_%s", requestTimes + 1, creaTime), defenseRatio + 1); } } } return false; }