发表于: 2020-06-10 23:45:41

1 1658


今天完成的事情:


做好短信通道的防攻击策略,邮箱的防攻击策略


容联云短信平台是有自己的防攻击功能的

一个短信模板一天最多发5条信息。


虽然有官方作背书  

但自己还要在代码里写逻辑  


前台页面      作限制

后台服务器    作限制

短信平台   作限制


三重保险




我的代码里设置的  


邮箱  手机    均不能超过5次


限制次数的缓存   在每天00:00到期   又可以继续发5条


/**   短信记录发送次数的缓存
*  缓存Key的名称: Num = 手机号+"Num"
*  缓存Key的结果: NumResultA
*
*  逻辑:
*  1. NumResultA为空:
*  set新值   Num(Key)1(Value),  overTime(距离0点的秒数),  TimeUnit.SECONDS
*
*  1. NumResultA不为空:
*  删除原有缓存
*   set新值   Num(Key)NO(Value),  overTime(距离0点的秒数),  TimeUnit.SECONDS
*  (NO是啥 : 调用了工具类,取出value 自增1 再返回  )
*
*/

//Num作为key(手机号+Num字符,举例:13152858844Num)
String Num = email+"Num";
logger.info("记录此邮箱缓存的key"+Num);

//获取名为Num的参数
String NumResult = (String) redisTemplate.opsForValue().get(Num);
logger.info("获取Num的结果为"+NumResult);

//如果参数为空  设置一个新的缓存,过期24小时
if(NumResult==null){
   logger.info("Num缓存为空");

   try {
       //距离今晚0点过期还有多久
       long overTime = STUtil.overtime();
       logger.info("距离0点还有"+overTime+"s");

       String NO = "1";
       redisTemplate.opsForValue().set(Num,NO,overTime,TimeUnit.SECONDS);
       logger.info("新建一个Num缓存,初始值为1");
   }catch (Exception e){
       logger.info("新建Num缓存失败");
       e.printStackTrace();
   }

}else {
   //如果参数不为空,则自增1
   logger.info("Num缓存不为空");

   //自增当前次数
   String NO = STUtil.incr(NumResult);
   logger.info("当前的次数增至"+NO+"");

   //距离今晚0点过期还有多久
   long overTime = STUtil.overtime();
   logger.info("距离今晚0点还有"+overTime+"s");

   redisTemplate.delete(Num);
   logger.info("删除原有缓存");

   redisTemplate.opsForValue().set(Num,NO,overTime,TimeUnit.SECONDS);
   logger.info("新建缓存");
}


redis其实是有个incr方法的     可以让数据自增




spring-redistemplate    也有  叫increment


但我没用自带的   感觉转换类型好麻烦   


就自己写了一个工具类  来调用

感觉这个更方便


一个传入数据自增    

一个返回距离晚上00:00还有多少秒


@Component
public class StringTimeUtil{

   //String转化为int  自增1后  再转回String

   public String incr(String NumResult){

       int  n = Integer.parseInt(NumResult);
       n++;
       String Num = ""+n;

       return Num;

   }
   
   //返回截止时间(距当晚0000

   public long overtime()  {

        long now = System.currentTimeMillis();
        SimpleDateFormat sdfOne = new SimpleDateFormat("yyyy-MM-dd");

        try {
            long overTime = (now - (sdfOne.parse(sdfOne.format(now)).getTime())) 1000;
            //当前时间  距离当天凌晨  秒数     ==75404
            System.out.println("距离今晚0点还有"+overTime+"s");
            return overTime;
        }catch (Exception e){
            System.out.println("返回时间错误");
            return overtime();
        }
   }
}



测试次数没问题





运行期间碰到一个奇怪的报错:


java.lang.NoSuchMethodError: com.google.gson.JsonParser.parseString(Ljava/lang/String;)Lcom/google/gson/JsonElement


解决: 把这个依赖版本从2.8.5——>2.8.6  就好了

版本问题  莫名奇妙



明天计划的事情:



提交任务



返回列表 返回列表
评论

    分享到