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

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

代码部分

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)) < 60) {

//System.out.println("请一分钟后再次重试" + new Date());

return "请等待一分钟后再次重试!";

} else {

//发送短息

String recode = SmsInfo(phone);

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

return recode;

}

}

}

}catch(Exception e){

logger.error(e.getMessage());

}

return "false";

}

/**

* 发送短息

* @return

*/

public static String SmsInfo(String phone){

这里设置短信验证码的接口和账户密码部分(自己购买的接口在这里)

String url ="http://www.ztsms.cn/sendNSms.do";

String username ="";//内容

String password ="";//密码

String mobile = phone; //号码

String content ="您本次操作的的验证码是:"+sale+",验证码五分钟内有效,请不要把验证码发送给别人!";//内容

String productid =""; //产品id

String xh ="";//设置为空

String tkey = TimeUtil.getNowTime("yyyyMMddHHmmss");

try{

content= URLEncoder.encode(content,"utf-8");

}catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

String param="gateway="+url+"&username="+username+"&password="+ MD5Gen.getMD5(MD5Gen.getMD5(password)+tkey)+"&tkey="+tkey+"&mobile="+mobile+"&content="+content+"&productid="+productid+"&xh"+xh;

// String ret= HttpRequest.sendGet(url, param);//sendPost or sendGet 即get和post方式

System.out.println("ret:"+ret+param);

return sale;

}

}

用到的工具类的部分

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

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

    标签:url   control   operation   短信验证码   reg   cep   ppi   任务   用户 Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+R ...

  2. java短信验证码失效时间_java实现短信验证码5分钟有效时间

    本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存 ...

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

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

  4. java前台计算date差_js前台计算两个日期的间隔时间

    js前台计算两个日期的间隔时间(时间差) 原创 2017年08月28日 16:09:43 标签:javascript 1144 在后台传来两个时间字段,从中解析出两个字符串类型的日期格式 需要在前台解 ...

  5. java 拖动验证码实现_java实现拖动图片验证码

    思路是,对原图产生两张图片,一张是底图,被抠掉一部分的图片,另外一张是移动图,被抠出的来部分 只写了后台怎么生成拖动验证码的两个图片,前端的还没写,待续.以下是后台的代码 class="ja ...

  6. java上传ftp数据丢失_Java:将文件上传到FTP问题(数据包丢失) - java

    我正在尝试将文件从Java应用程序传输到FTP服务器 该程序可以正常工作,文件已传输,但是当我在FTO文件夹中打开文件时,文件已损坏,我认为在文件传输过程中数据包丢失了.为什么?我该如何解决? 另一个 ...

  7. java定时执行一次_java Timer(定时调用、实现固定时间执行)

    最近需要用到定时调用的功能.可以通过java的Timer类来进行定时调用,下面是有关Timer的一些相关知识. 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个 ...

  8. 编写Java程序 堆栈的接口_java - 错误:调用实现接口的通用方法时,java.lang.AbstractMethodError - 堆栈内存溢出...

    我正在尝试使用javassist以编程方式创建和编译实现接口的类(在运行时). 每当我调用该动态类的实例时,都会收到以下错误消息: java.lang.AbstractMethodError: Foo ...

  9. 用java自动化访问百度测试_java+eclipse+selenium+百度搜索设置自动化测试

    在eclipse中新建一个项目baidutest:再在src文件夹中新建一个包com.baidutest.homework:再在包中新建一个java类baidusetting,并设置为静态类:最后在项 ...

最新文章

  1. 超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片
  2. python 内推_网易有道2017内推编程题 洗牌(python)
  3. Lucene查看分析器的分词效果
  4. PHP页面运行一半,在PHP中仅缓存页面的一部分
  5. python 可视化监控平台_python可视化篇之流式数据监控的实现
  6. 【ICLR2021必读】 【自监督学习】 【Transformer】相关论文
  7. cf519C. A and B and Team Training(找规律)
  8. redis 8种淘汰策略
  9. windows游戏编程大师技巧光盘
  10. 3.微信小程序--快速开发UI界面
  11. 清华上交等发表Nature子刊!分片线性神经网络最新综述!
  12. 教你轻松快速学会用Calibre TXT转MOBI
  13. SEM医械研发:常见医用塑料种类、特性与选用知识汇总
  14. 域名升级访问中拿笔记好_好记性也应做笔记,安利一款比onenote更好用的云笔记工具...
  15. 爬虫实践: 获取百度贴吧内容
  16. 分享:刚入行的朋友如何找到程序员工作,并成为优秀游戏程序员?
  17. Bootstrap+web+Idea实现登录页面(含验证码)
  18. 5G技术即将到来,5G网络的基本特点和应用你了解了多少
  19. VMware Workstation 不可恢复错误: (vmx)Exception 0xc0000006 (disk error while paging) has occurred.
  20. python 根据word生成ppt_python操作word、ppt的详解

热门文章

  1. 坐标+半径 生成 geohash
  2. 快客脚本引流工作室:每天用脚本快速引流几千上万到底是啥回事。
  3. 百度图片下载器2.0
  4. DICOM:基于DCMTK实现C-FIND SCU
  5. JavaScriptJQuery_jQuery简介
  6. EDG一追一追平LGD,四保一阵容的Iboy从来不会让我们失望!
  7. 2020前端学习路线收集整理
  8. 怎么用计算机算20次方,一个数的几次方怎么算,有简便方法吗?比如2的20次方,怎么算快?...
  9. AspectJ编译器织入与SpringAOP的运行期织入
  10. Ubuntu 安装 Gif 工具 -- Peek