目录

笔者在实际开发中,总能遇到一些 对验证次数的限制,比如 验证身份证这种api ,由于是收费的,为了防止恶意的提交身份证,所以 限制住是很重要的,分布式的系统中要么用 zookeeper ,要么redis ,这种没必要使用数据库去实现,

具体实现

  @Override
    public Map<String, Object> validateThreeElementByRisk(ApplyAuthReq applyAuth,String idkey) throws RequestException {

      if(!tDataDictService.judgeIdCardSum(idkey,Constants.INT_1)){
          throw new RequestException(ResCode.PAGE_LOAD_CLOSE.getCode(),"认证次数已达上限,请明天再试");
      } 
      Object resJson=HttpUtil.getObjectById(id);
        if (resJson != null && "200".equals(resJson.getString("code"))) { 
            }else if(resultJson.equals(Constants.INT_2)){
                throw new RequestException(ResCode.PAGE_LOAD_CLOSE.getCode(),"审核拒绝,不符合申请条件");
            }else{
                tDataDictService.subIdCardSum(idkey,Constants.INT_2);
                throw new RequestException(ResCode.PAGE_LOAD_CLOSE_WIND.getCode(),"身份信息不一致,请核对信息后再试");
            }
        } 
    }

首先 已进入方法时,马上判断 这个 id 是否 有 达到 3次的限制

 public boolean judgeIdCardSum(String id) {
        //判断是否包含某个Key
        String key=Constants.INSTALLMENT_KEY +Constants.ID_CARD_SUM+id+"_"+ DateUtils.formatStr6Date(new Date(),DateUtils.DATE_PATTON_3);
        boolean flag = jedisTemplate.KEYS.exists(key);
        if (!flag) {
            //不存在就是 第一次验证,那么就可以 设置一个过期时间和次数
            long exprieTme = 86400 - org.apache.commons.lang.time.DateUtils.getFragmentInSeconds(Calendar.getInstance(), Calendar.DATE);
            jedisTemplate.STRINGS.setEx(key, (int)exprieTme, Constants.INT_3);
            return  true;
        } else {
            // 存在就 需要判断次数是否是0,不为0,则减1
            String idValueStr = jedisTemplate.STRINGS.get(key);
            if(idValueStr.equals(Constants.INT_0)){ //0 代表该天的次数用完
                return false;
            }else{ 
                return true;
            }
        }
    }

使用redis做限制的具体

当发生不符合的时候,实时给 redis对应的key -1

    public boolean subIdCardSum(String id) {
        //判断是否包含某个Key
        String key=Constants.INSTALLMENT_KEY +Constants.ID_CARD_SUM+id+"_"+ DateUtils.formatStr6Date(new Date(),DateUtils.DATE_PATTON_3);
        boolean flag = jedisTemplate.KEYS.exists(key);
        if (!flag) {
            //不存在就是 第一次验证,那么就可以 设置一个过期时间和次数
            long exprieTme = 86400 - org.apache.commons.lang.time.DateUtils.getFragmentInSeconds(Calendar.getInstance(), Calendar.DATE);
            jedisTemplate.STRINGS.setEx(key, (int)exprieTme, Constants.INT_3);
            return  true;
        } else {
            // 存在就 需要判断次数是否是0,不为0,则减1
            String idValueStr = jedisTemplate.STRINGS.get(key);
            if(idValueStr.equals(Constants.INT_0)){ //0 代表该天的次数用完
                return false;
            }else{ 
                    String newValue=  String.valueOf(Integer.valueOf(idValueStr)-1);
                    jedisTemplate.STRINGS.set(key, newValue); 
                return true;
            }
        }
    }
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐