1. 程式人生 > >防刷介面的實現

防刷介面的實現

這是小編在某生鮮第一的電商網際網路公司的防刷介面,大家可以研究研究。

/**
     * 判斷惡意攻擊.
     *
     * @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;
    }