发表于: 2020-06-10 23:45:41
1 1656
今天完成的事情:
做好短信通道的防攻击策略,邮箱的防攻击策略
容联云短信平台是有自己的防攻击功能的
一个短信模板一天最多发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;
}
//返回截止时间(距当晚00:00)
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 就好了
版本问题 莫名奇妙
明天计划的事情:
提交任务
评论