标签:url   control   operation   短信验证码   reg   cep   ppi   任务   用户

Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)

这篇文章,实现了Java发送手机短信验证码发送的间隔时间,以及手机验证码的有效时间和手机验证码格式的合法性验证,可以防止恶意刷接口

关于Java项目怎么连接redis,请看这一篇文章 https://www.cnblogs.com/nanstar/p/13367747.html

代码部分

package com.zxjs.controller.app;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiImplicitParam;

import io.swagger.annotations.ApiOperation;

import org.apache.commons.lang.RandomStringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;

import redis.clients.jedis.Jedis;

import java.util.HashSet;

import java.util.Set;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* 发送短信验证码

*/

@Api(value="发送短信验证码",description = "发送短信验证码,默认发送短信的间隔是一分钟",tags = {"发送短信验证码"})

@RestController

@RequestMapping("appISendSms")

public class SendSMS {

private final static Logger logger = LoggerFactory.getLogger(SendSMS.class);

/**

* 链接redis数据库,使用验证码的时候,只需要在其他的地方用redis查询这个手机号的验证码就可以了

*/

static Jedis jedis = new Jedis("localhost");

/**

* 生成随机的六位验证码

*/

static String sale = "";

/**

* @param args

*/

public static void main(String[] args) throws InterruptedException{

//手机号测试部分

sendSmsInfo("13683654784");

}

/**

* 发送验证消息

* 传入手机号,接收到的是用户的手机号码

* @return

*/

@ApiOperation(value="发送验证消息",notes = "发送验证消息,默认同一个手机号码发送短信间隔是一分钟,加入手机号码格式验证,可使用时长是五分钟,可以有效防止恶意刷接口")

@ApiImplicitParam(paramType = "query",name="phone",value = "0",required = true)

@GetMapping("getReCode")

@ResponseBody

public static String sendSmsInfo(String phone){

//进入发送逻辑的时候生成随机验证码,六位数字

sale = RandomStringUtils.randomNumeric(6);

//思路,每个手机号进来的时候,放到redis里面一个值,(手机号,验证码+开始时间)

// 当这个用户再次来查询的时候,查看时间是否到达一分钟,到达的话可以发送验证码

try {

//验证码有效时间,放到redis缓存里面(手机号,验证码+开始时间),根据开始时间来判断,达到了时间删掉缓存里面的手机号

String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9])|(16[6]))\\d{8}$";

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(phone);

boolean isMatch = m.matches();

if (! isMatch) {

return "手机号码格式不正确,请核对后重新输入!";

} else {

/*检测redis是否开启,未开启的话,返回信息*/

if(jedis.ping() == "PONG"){

return "Redis Is Not Run!";

}

//当前时间秒数

Long timemili = System.currentTimeMillis() / 1000;

//System.out.println("当前的秒数" + timemili);

//System.out.println(jedis.dbSize());

//System.out.println(jedis.keys("*"));

/*在这里写一个定时的for循环,用来取redis的手机号码信息,然后查询手机号码开始的时间,若是大于等于五分钟

* 就给删除这个键值*/

//创建多线程定时任务,延迟1s启动,每隔1s执行一次,是前一个任务开始时就开始计算时间间隔,但是会等上一个任务结束在开始下一个

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);

scheduledExecutorService.scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

/*执行程序的位置*/

//首先取出所有的手机号 键信息,放到新的集合里

Set setPhone = new HashSet();

setPhone = jedis.keys("*");

for (Object setInfo : setPhone) {

//判断这个键的值是不是超过五分钟,是的话就删除掉这个键

System.out.println("计算结果"+ (System.currentTimeMillis() / 1000 - Long.parseLong(jedis.get(setInfo.toString()).substring(6))) );

if(System.currentTimeMillis() / 1000 - Long.parseLong(jedis.get(setInfo.toString()).substring(6)) > 300){

jedis.del(setInfo.toString());

}

//System.out.println(setInfo);

}

}

}, 1, 2, TimeUnit.SECONDS);

/**

* 设置键值的时候先查询是否存在这个键值对,存在的话查看时长,不存在的话直接发送短信

*/

boolean str = jedis.exists(phone);

if (! str) {

//发送短息

String recode = SmsInfo(phone);

jedis.set(phone, (sale + timemili));

return recode;

} else {

String strT = jedis.get(phone);

//查看请求间隔,默认是一分钟,小于一分钟继续等待,超过一分钟发送短信

if (timemili - Long.parseLong(strT.substring(6))

用到的工具类的部分

phoneUtils https://files.cnblogs.com/files/nanstar/phoneUtils.zip

Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)

标签:url   control   operation   短信验证码   reg   cep   ppi   任务   用户

Java设置短信间隔时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...相关推荐

  1. java中短信验证登录_java实现短信验证码功能

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这几天老大让我弄一个发送短信验证码的功能,使用的是大汉云通讯的短信平台接口,调用短信平台提供的接口(遵循短信平台的接口规范即可).具体看代码: impor ...

  2. java如何使显示字符下标_Java如何在 Word 中设置上、下标

    上标是指比同一行中其他文字稍高的文字,而下标是指比同一行中其他文字稍低的文字.在生活中,我们常见的平方米.立方米等符号以及化学中的各种元素符号,都是利用上.下标来表示的.本文将介绍通过Free Spi ...

  3. java设置器或访问器_java里面的构造器、设置器、访问器的作用

    java里面的构造器是一个与类同名的特殊的方法,称为构造方法,在创建类的对象时使用,用于对象初始化. 设置器是一个针对类的某个私有属性成员属性的有特殊命名要求的方法,发XXX属性,应为setXXX.主 ...

  4. java 位运算取8位_Java 9 AOT 试用:仅支持 64 位 Linux和java.base 模块编译

    Java 9 引入了 aot 编译方式,能够将 class 文件直接编译成可执行二进制文件.目前 Java 9 的 early access 版本已经提供了编译工具,让我们来看看它的功能吧. 注意:按 ...

  5. java如何设置1.5倍行距_Java如何在iText中设置段落行间距?

    要设置的行间距在iText的段落可以通过传递线空间/领先的参数进行Paragraph构造.在下面的示例中,我们将行距设置为32.我们还可以通过调用此对象的setSpacingBefore()和setS ...

  6. java poi excel 单元格样式_java poi批量导出excel 设置单元格样式

    POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb ...

  7. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?

    我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...

  8. java短信验证码失效时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...

    Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis) 这篇文章,实现了Java发送手机短信验证码发送的间隔时间,以及手机验证码的有效时间和手机验证码格式的合法性验证,可以防 ...

  9. java短信验证平台_JAVA实现利用第三方平台发送短信验证码

    前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例, ...

最新文章

  1. Arm architecture 第一章
  2. post基础-百度翻译接口测试
  3. js es6 reduce用法示例:实现数据累加
  4. 使用append之后数组维度消失_JAVA魅力之神奇的数组带给你不一样的乐趣
  5. java的indexof怎么配合数组使用_【小知识点??】indexOf在数组中竟能这样使用???!...
  6. CompletableFuture详解~getNow
  7. Deep learning:十六(deep networks)
  8. sqlalchemy 增删改
  9. VMWare下窗口大小调整
  10. mini车f和r的区别_雪铁龙也造出了“老头乐”,外观复古时尚,叫板宏光MINI?...
  11. Atitit 格式转换的艺术 以excel转换txt为例
  12. 使用DataDynamics.ActiveReports 创建子报表
  13. 锐捷——DCHP动态分配IP地址
  14. ubuntu图形界面乱码解决办法
  15. 好消息!这些城市个人手机、在家“刷脸”都能提取公积金,有你家吗?
  16. DirectX11_HLSL入门篇
  17. java如何做聚类分析_K-means算法的Java实现 聚类分析681个三国武将
  18. 准备注册网易企业邮箱,安全功能怎么样?
  19. this.$nextTick
  20. 关于反函数的二阶导数

热门文章

  1. 计算机考试 什么链,啥数组、链表、线性结构?计算机二级office选择题必考串讲2-2...
  2. iOS tintColor与backgroundColor的区别
  3. Linux中echo命令向一个文件写入内容
  4. 数据库同时更新多个字段
  5. 活动图(Activity Diagram)
  6. 大聪明教你学Java设计模式 | 第二十一篇:解释器模式
  7. 你知道Alpha/Beta/RC/RTM/RTW/GA是什么版本吗?
  8. 煤电再现冰火两重天 近九成电企业绩不佳
  9. Photoshop制作具有梦幻效果的宣传海报
  10. 使用录音证据应注意哪些问题