java短信验证码失效时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...
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)...相关推荐
- Java设置短信间隔时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...
标签:url control operation 短信验证码 reg cep ppi 任务 用户 Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+R ...
- java短信验证码失效时间_java实现短信验证码5分钟有效时间
本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存 ...
- java中短信验证登录_java实现短信验证码功能
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这几天老大让我弄一个发送短信验证码的功能,使用的是大汉云通讯的短信平台接口,调用短信平台提供的接口(遵循短信平台的接口规范即可).具体看代码: impor ...
- java前台计算date差_js前台计算两个日期的间隔时间
js前台计算两个日期的间隔时间(时间差) 原创 2017年08月28日 16:09:43 标签:javascript 1144 在后台传来两个时间字段,从中解析出两个字符串类型的日期格式 需要在前台解 ...
- java 拖动验证码实现_java实现拖动图片验证码
思路是,对原图产生两张图片,一张是底图,被抠掉一部分的图片,另外一张是移动图,被抠出的来部分 只写了后台怎么生成拖动验证码的两个图片,前端的还没写,待续.以下是后台的代码 class="ja ...
- java上传ftp数据丢失_Java:将文件上传到FTP问题(数据包丢失) - java
我正在尝试将文件从Java应用程序传输到FTP服务器 该程序可以正常工作,文件已传输,但是当我在FTO文件夹中打开文件时,文件已损坏,我认为在文件传输过程中数据包丢失了.为什么?我该如何解决? 另一个 ...
- java定时执行一次_java Timer(定时调用、实现固定时间执行)
最近需要用到定时调用的功能.可以通过java的Timer类来进行定时调用,下面是有关Timer的一些相关知识. 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个 ...
- 编写Java程序 堆栈的接口_java - 错误:调用实现接口的通用方法时,java.lang.AbstractMethodError - 堆栈内存溢出...
我正在尝试使用javassist以编程方式创建和编译实现接口的类(在运行时). 每当我调用该动态类的实例时,都会收到以下错误消息: java.lang.AbstractMethodError: Foo ...
- 用java自动化访问百度测试_java+eclipse+selenium+百度搜索设置自动化测试
在eclipse中新建一个项目baidutest:再在src文件夹中新建一个包com.baidutest.homework:再在包中新建一个java类baidusetting,并设置为静态类:最后在项 ...
最新文章
- 超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片
- python 内推_网易有道2017内推编程题 洗牌(python)
- Lucene查看分析器的分词效果
- PHP页面运行一半,在PHP中仅缓存页面的一部分
- python 可视化监控平台_python可视化篇之流式数据监控的实现
- 【ICLR2021必读】 【自监督学习】 【Transformer】相关论文
- cf519C. A and B and Team Training(找规律)
- redis 8种淘汰策略
- windows游戏编程大师技巧光盘
- 3.微信小程序--快速开发UI界面
- 清华上交等发表Nature子刊!分片线性神经网络最新综述!
- 教你轻松快速学会用Calibre TXT转MOBI
- SEM医械研发:常见医用塑料种类、特性与选用知识汇总
- 域名升级访问中拿笔记好_好记性也应做笔记,安利一款比onenote更好用的云笔记工具...
- 爬虫实践: 获取百度贴吧内容
- 分享:刚入行的朋友如何找到程序员工作,并成为优秀游戏程序员?
- Bootstrap+web+Idea实现登录页面(含验证码)
- 5G技术即将到来,5G网络的基本特点和应用你了解了多少
- VMware Workstation 不可恢复错误: (vmx)Exception 0xc0000006 (disk error while paging) has occurred.
- python 根据word生成ppt_python操作word、ppt的详解
热门文章
- 坐标+半径 生成 geohash
- 快客脚本引流工作室:每天用脚本快速引流几千上万到底是啥回事。
- 百度图片下载器2.0
- DICOM:基于DCMTK实现C-FIND SCU
- JavaScriptJQuery_jQuery简介
- EDG一追一追平LGD,四保一阵容的Iboy从来不会让我们失望!
- 2020前端学习路线收集整理
- 怎么用计算机算20次方,一个数的几次方怎么算,有简便方法吗?比如2的20次方,怎么算快?...
- AspectJ编译器织入与SpringAOP的运行期织入
- Ubuntu 安装 Gif 工具 -- Peek