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

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

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

这里说一下具体的思路:因为确实有时候我们在注册的时候会发送各种意外。比如当时信号不好啊,或者莫名其妙的手机短信没收到啊不可避免的,所以一个人一天只能发一条短信肯定也不合理。然后我们老板目前设置的是一个人一天能接收的验证码是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的文章:

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

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

本站以现代、古代情诗为主,情诗网创办于2013年,以原创爱情诗歌、经典情诗、现代情诗、古代情诗、英文情诗、情诗绝句为主并收集古诗、古诗词、诗歌大全、诗词名句的文学门户。方便您下次继续阅读;可以放在浏览器的收藏夹中(快捷键Ctrl+D);或者看到喜欢或者有趣的诗词可以通过分享按钮给你的好友分享;情诗网是目前最全情诗大全网站之一。并欢迎广大诗歌爱好者阅览投稿!喜欢本站的话请大家把本站告诉给你朋友哦!地址是 www.qingshiwang.com !

java 短信 条数 计算_接收短信验证码条数限制(java发送短信验证码限制)相关推荐

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

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

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

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

  3. java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java

    我正在研究基于TCP的通信协议.我所知 有很多方法可以确定何时结束阅读. 在消息末尾关闭连接 将消息的长度放在数据本身之前 使用分隔符:一些在正常数据中永远不会出现的值(或者总会以某种方式转义) 通常 ...

  4. java 最少货币单元组合换钱_动态规划. 换钱的最少货币数和最多方法数

    通过对换钱类题目的学习,我们将了解到 暴力递归及优化方法 记忆搜索(优化一) 动态规划的基本实现方法(优化二) 动态规划的空间优化(优化三) 1. 换钱的最少货币数,货币可重复使用 给定数组arr,a ...

  5. java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则

    前言 以一个java老鸟的角度,如何去看 kotlin. Java源代码应该如何用Kotlin重构. 如何正确学习kotlin并且应用到实际开发中.本文将会探究. 本文分两大块,重难点和潜规则. 重难 ...

  6. java web开源项目源码_超赞!推荐一个专注于Java后端源码分析的Github项目!

    大家好,最近有小伙伴们建议我把源码分析文章及源码分析项目(带注释版)放到github上,这样小伙伴们就可以把带中文注释的源码项目下载到自己本地电脑,结合源码分析文章自己本地调试,总之对于学习开源项目源 ...

  7. java源程序分为两大类_根据程序运行的环境不同,JAVA源程序分为两大类,那两个类?-----并解析什么意思...

    根据程序运行的环境不同,JAVA源程序分为两大类,那两个类?-----并解析什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来 ...

  8. java读取百万条记录出错_如何实现导出百万条数据到EXCEL中不报OOM异常?

    Java项目中使用POI导出百万条数据到Excel中,但是会出现内存溢出异常. 存在以下问题需要考虑POI导出条数限制6w+ 数据量大的话会导致内存溢出 现在的做法是每6w条数据做一次分割,创建一个新 ...

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

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

最新文章

  1. java n个点 凸多边形_hrbustoj 1291 点在凸多边形内
  2. 【Android】JNICALL could not be resolved
  3. arm9重启ssh服务_部署ssh使用rsa登录配置
  4. Qt文档阅读笔记-QWebView官方解析与实例
  5. Spring Boot入门——多文件上传大小超限问题解决
  6. librdkafka 安装
  7. oracle .net 中文,asp.net查出 oracle数据库中的中文乱码问题
  8. CentOS7下初始化PostgreSQL
  9. RBF神经网络——案例一
  10. Unity Plastic SCM (无法托管/当前仓库地址错误/创建新项目无法托管/由于目标计算机积极无法连接)
  11. idea类和方法注释模板配置
  12. 自动光学检测(AOI)
  13. 计算机信息安全技术分为两个层次,计算机信息安全技术分为两个层次,其中的第二层次为()...
  14. mybatis在关联映射中,引入外部xml文件中定义的对象
  15. 当我们想要用LinkedIn领英开发客户时,如何设计填写职位头衔?
  16. 我们分析了 10000 条视频,终于知道了今日头条推荐系统的秘密
  17. 小重山 2022年4月22日
  18. 孔子的“治学三境界”
  19. 饿了么UI图片上传的实现
  20. Prodigal基因预测

热门文章

  1. mac电脑免费将caj转pdf,将pdf转word菜鸟教程
  2. suse linux 版本查看,SUSE Linux 查看版本号
  3. 日期选择(年月日,年月)
  4. 为什么NMOS管比PMOS管用得多--电子迁移率-宽禁带-半导体材料参数介绍
  5. 机器学习算法--python--sklearn--后续神经网络
  6. matlab开卷考试,开卷考试
  7. 视频软解码和硬解码的区别
  8. 上海软件和信息服务产业去年增长14.1%,呈现五大特点
  9. nuc972 spi驱动修改提升SPI nor flash读写性能
  10. 面对对象程序设计YYX615