今天是个周六,还在苦逼加班的我对那些休周末的同行表达羡慕嫉妒,对那么同样加班的同行共勉吧~~

整理了下这周的工作进度。除了项目试上线以外也就是补充补充之前遗留下的小问题了。这篇文章就是说手机号每天接受验证码的条数限制。

我们现在的好多程序注册需要手机号并且发送验证码来验证手机号的真伪。以前常用的就是阿里的发送短信的功能(感觉这个真的很常用,阿里的产品还是值得信赖的)。不过我们这个项目采用的是极光的短信功能。不过这个其实不重要,因为我们来限制一个手机号 一天可以发多少短信和短信平台无关。我这里是因为老板说听说某某程序员说受到过这样的攻击,不到一个小时一个产品发出去几千块钱的短信费用。而且我另一个朋友也说过如果不加以限制可能他一个多线程跑过去我们平台的短信费用立刻欠费。

这里说一下具体的思路:因为确实有时候我们在注册的时候会发送各种意外。比如当时信号不好啊,或者莫名其妙的手机短信没收到啊不可避免的,所以一个人一天只能发一条短信肯定也不合理。然后我们老板目前设置的是一个人一天能接收的验证码是10条(多了少了是可以设置的。不过我接下的例子也是一个手机号码一天可以接收十条验证码)。我这里采用的是存redis来实现这一个功能的(感觉这里数据库也可以实现,但是不如reids好。最近敲喜欢redis的说,用起来得心应手,哈哈)。就是每次调用发送验证码这个接口都会判断手机号码是否在redis中存为key了。如果没有则创建一个key为手机号码value是1.因为redis中不支持数字所以我是1+“”将其变为了string类型。如果redis中已经有这个key了则将此key的值取出来加1再存进redis中。这里在做的时候过期问题有一点小纠结。最后想明白了。我们老板的要求是每天。也就是这个key-value的存活期应该是到今天结束。所以我又专门做了个小工具类来获取当前时间到今天结束时间(也就是23点59分59秒999毫秒+1毫秒的时间)的毫秒数。并将此作为这个key的到期时间的(关于这个我是给予我的实际情况来设计的,如果亲们有啥别的具体的需求可以酌情更改)。

这里上一下代码:

首先是获取当前时间到今天结束时间所剩余的毫秒数:/**

* 获取当前时间到今天结束 的毫秒数

*因为这个是工具类里面的方法所以是静态的

* @return

*/

public static long getEndTime() {

//获取当前时间的毫秒数

long time = new java.util.Date().getTime();

//获取到今天结束的毫秒数

Calendar todayEnd = Calendar.getInstance();

todayEnd.set(Calendar.HOUR_OF_DAY, 23); // Calendar.HOUR 12小时制。HOUR_OF_DAY 24小时制

todayEnd.set(Calendar.MINUTE, 59);

todayEnd.set(Calendar.SECOND, 59);

todayEnd.set(Calendar.MILLISECOND, 999);

long endTime = todayEnd.getTimeInMillis();

//这里endTime-time获取的是到23:59:59:999的毫秒数。再加1才是到24点整的毫秒数

return endTime-time+1;

}

然后发送短信接口的代码:public ResultBean SendSMSCode(String tel) {

if("10".equals(stringRedisTemplate.opsForValue().get(tel))) {

return Tools.result(200, "您的手机号码已达到发送验证码次数上限", null, false);

}

SMSClient client = new SMSClient(masterSecret, appkey);

SMSPayload payload = SMSPayload.newBuilder().setMobileNumber(tel).setTempId(1).build();

try {

//这句代码是真正发送验证码的方法。如果你们用别的平台的接口也应该有一句话是真正发送的代码。

SendSMSResult res =client.sendSMSCode(payload);

if(stringRedisTemplate.opsForValue().get(tel)==null) {

stringRedisTemplate.opsForValue().set(tel, "1", Tools.getEndTime(), TimeUnit.MILLISECONDS);

}else {

String value = stringRedisTemplate.opsForValue().get(tel);

int times = Integer.parseInt(value)+1;

String timesStr = String.valueOf(times);

stringRedisTemplate.opsForValue().set(tel, timesStr, Tools.getEndTime(), TimeUnit.MILLISECONDS);

}

return Tools.result(200, "发送验证码成功", res, true);

} catch (Exception e) {

LOG.info("Error Message: " + e.getMessage());

return Tools.result(500, "发送验证码失败", null, false);

}

}

额,还是大概说一下代码的逻辑吧。首先进入到这个接口就要判断此手机号是否已经发到了10次上限。如果已经发到了则直接返回限制。如果没达到每日上限才往下继续。然后加粗的这几句都是发送短信的代码。平台不一样肯定不是一种写法。就不多说了。然后是等短信发送成功了才操作的。这一点很注意,短信发送成功才算一次次数。然后判断redis中是否有次手机号为key,如果没有则创建一个,值是1,如果有则在原来的基础上+1。没啥复杂的逻辑操作,就是一个思路而已。然后每次过期时间都是根据当前时间来获取的。单位是毫秒。如果业务需求是24小时什么的也可以灵活改动。

感觉代码中也没啥有难度的地方。如果说有看不懂的比如说对redis操作看不懂可以跳转专门讲StringRedisTemplate的文章:

然后有更好的实现方式或者思路的可以留言或者私聊我~~

全文手打~~这么不容易的写个文~~如果你觉得用到了~留个言点个赞转个发什么的啊~

java短信判断长度_接收短信验证码条数限制(java发送短信验证码限制)相关推荐

  1. java根据日期判断星座_给定公历日期计算12星座(Java代码实现)

    给定公历日期,计算返回该日期对应的十二星座. public static String getXingZuoName(int month, int day); 注意:参数month和day均为公历月. ...

  2. java 短信 条数 计算_接收短信验证码条数限制(java发送短信验证码限制)

    今天是个周六,还在苦逼加班的我对那些休周末的同行表达羡慕嫉妒,对那么同样加班的同行共勉吧~~ 整理了下这周的工作进度.除了项目试上线以外也就是补充补充之前遗留下的小问题了.这篇文章就是说手机号每天接受 ...

  3. java短信验证码功能发送的验证码如何校验_java 实现发送短信验证码功能

    原标题:java 实现发送短信验证码功能 如何使用java + maven的项目环境发送短信验证码,本文使用的是榛子云短信 的接口. 1. 安装sdk 下载地址: http://smsow.zhenz ...

  4. java短信验证码功能发送的验证码如何校验_Java实现发送短信验证码功能

    一个发送短信验证码的功能,使用的是信易通的短信平台接口,然后在Java中使用HttpClient模拟POST请求或者GET请求(看短信平台要求,一般的情况下都是POST请求),调用短信平台提供的接口( ...

  5. python发送手机验证码_[python发送短信验证码不用三方模块]python发送短信验证码...

    业务: 手机端点击发送验证码,请求发送到python端,由python调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 代码: ...

  6. Django验证码*短信验证码之2-容联云通讯短信平台(联云通讯短信平台介绍、容联云通讯Python SDK、封装发送短信单例类)

    容联云通讯短信平台介绍 容联云通讯网址:https://www.yuntongxun.com/ 容联云管理控制台 容联云创建应用 容联云通讯Python SDK https://doc.yuntong ...

  7. java不定义数组长度_在JAVA中定义数组时,可不可以一开始不设定数组的长度?...

    MYYA 定义时当然可以:例如 int[] a;但是要把它初始化成为一个真正意义上的数组就必须设定长度: int [] a = new int[10]; 这时就只能改变数组里的数值而不能改变它的长度了 ...

  8. java二级考试真题_计算机等级考试真题2(JAVA)

    1. D (A)类属于JAVA语言的引用数据类型. (B)接口属于JAVA语言的引用数据类型. (C)数组属于JAVA语言的引用数据类型. (D)double不属于JAVA语言的引用数据类型. 2. ...

  9. java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串

    java 字符串 字节数组 Today we will learn how to convert String to byte array in java. We will also learn ho ...

最新文章

  1. 安装部署Spark 1.x Standalone模式集群
  2. AI一分钟|外媒:AI将消灭资本主义;特斯拉再遭唱空:量产存疑外加事故不断...
  3. 回文数猜想代码c语言,跪求用C++写出回文数猜想程序,课程设计需要,谢谢。。。...
  4. java xml添加节点_Java对XML节点的修改、添加、删除 –By Xstream框架
  5. Boost:assume aligned假设对齐的测试程序
  6. EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient
  7. Pad和Margin
  8. word-break:break-all和word-wrap:break-word的区别
  9. c语言中有关main的问题,c语言小问题
  10. 精通ASP.NET MVC ——视图
  11. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)
  12. 电脑ping服务器显示传输失败,Win10系统ping时出现传输失败常见故障解决办法
  13. C语言:字符数组赋值
  14. Android开发笔记(一百一十七)app省电方略
  15. linux安装cd dev ls,linux 第一节 安装
  16. jdk8下载要先有Oracle账号吗,【转载】linux安装jdk8--附带oracle账号
  17. C++学习008-delete与delete[]的差别
  18. visual studio 2019配置dlib读取jpeg图片
  19. http client
  20. 提高效率:17款超赞的谷歌chrome浏览器插件、扩展程序

热门文章

  1. java中右移_Java中的按位右移运算符
  2. ppwjs之bootstrap文字排版:引用元素
  3. 如何在两个月内考过软考高级
  4. blockly自定义中文出问题_Blockly 中文文档(翻译)
  5. Java新手极简指北手册
  6. 苹果究竟对AI是怎么看的?现在终于有答案了
  7. 全景丨0基础学习VR全景制作,后期篇:嵌入视频前期注意事项及后期处理
  8. 我的世界制作服务器rj,我的世界星系mod常用工具制作方法
  9. Openresty实现反向代理
  10. 计算机专业课程评价,计算机专业学生学习的自我评价