如何使用Java redis实现发送手机验证码功能
作者:护花使者 发布时间:2023-11-26 17:25:00
标签:Java,redis,手机,验证码
要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次
代码如下
import redis.clients.jedis.Jedis;
import java.util.Random;
public class ValidationTest {
public static void main(String[] args) {
//getValidation("15005076571");
//checkValidation("769897","15005076571");
}
static void getValidation(String tel) {
//主机、端口
Jedis jedis = new Jedis("myhost", 6379);
//密码
jedis.auth("mypassword");
try {
//获取电话号码
String phoneNo = tel;
//本人用1库进行测试
jedis.select(1);
String countKey = phoneNo + ":count";
String codeKey = phoneNo + ":code";
//获取指定的电话号码发送的验证码次数
String cnt = jedis.get(countKey);
//对次数进行判断
if (cnt == null) {
//没有发送过验证码
jedis.setex(countKey, 60 * 60 * 24, "1");
//发送验证码,假设生成的验证码
StringBuffer code = new StringBuffer();
for (int i = 0; i < 6; i++) {
code.append(new Random().nextInt(10));
}
System.out.println("code:" + code);
//缓存中添加验证码
jedis.setex(codeKey, 60 * 2, code.toString());
} else {
if (Integer.parseInt(cnt) < 3) {
//发送验证码,假设生成的验证码
StringBuffer code = new StringBuffer();
for (int i = 0; i < 6; i++) {
code.append(new Random().nextInt(10));
}
System.out.println("code:" + code);
//缓存中添加验证码
jedis.setex(codeKey, 60 * 2, code.toString());
//递增手机发送数量
jedis.incr(countKey);
} else {
//返回超出3次,禁止发送
System.out.println("超出3次,禁止发送");
}
}
} catch (Exception e) {
//这边其实是需要回滚下redis
e.printStackTrace();
} finally {
//关闭redis
if (jedis != null) {
jedis.close();
}
}
}
static void checkValidation(String code, String tel) {
Jedis jedis = null;
try {
jedis = new Jedis("myhost", 6379);
//密码
jedis.auth("mypassword");
jedis.select(1);
String codeKey = tel + ":code";
String validation = jedis.get(codeKey);
if (validation == null) {
System.out.println("验证码未发送或者失效");
} else {
if (validation.equals(code)) {
System.out.println("验证成功");
} else {
System.out.println("验证失败");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
来源:https://www.cnblogs.com/chenmz1995/p/12562328.html
0
投稿
猜你喜欢
- JPA Specification常用查询+排序1.第一步:继承父类public interface TblCarton2RCardLogR
- 本文实例为大家分享了Java执行SQL脚本文件到数据库的具体方式,供大家参考,具体内容如下方式一:直接读取SQL脚本文件的内容,然后传递到S
- 一、输入输出流对象cout:标准输出流cerr:标准出凑 和cout(只是用于如果是错误时要输出的)cin :&nb
- 在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁。S
- 一、封装类1.封装类概念Java中存在基础数据类型,但是在某些情况下,我们要对基础数据类型进行对象的操作,例如,集合中只能存对象,而不能存在
- 单行文本的输入存在严重的缺陷,也不适合实际的运用,本节通过一个无功能的记事本来介绍可以进行多行输入的JTextArea:JTextArea(
- 这篇文章主要介绍了SpringBoot路径映射实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 如何实现封装可以分为两步:第一步:将类的变量声明为private。第二步:提供公共set和get方法来修改和获取变量的值。代码展示publi
- 几个月前写过一篇博客《xUtils3.0框架学习笔记》 ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下:private vo
- 简介我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件就相当
- 定义与结构 备忘录(Memento)模式又称标记(Token)模式。GOF给备忘录模式的定义为:在不破坏
- 假如是在同一台机器上开发,前后端分离的工程中出现跨域问题的原因是,前端工程和后端工程运行在不同的端口上。只要协议、域名、端口有一个不同就会产
- 本文实例讲述了Android编程开发之TextView单击链接弹出Activity的方法。分享给大家供大家参考,具体如下:话不多说直接上码:
- 命令仓库 Ctrl + Shift + A 可以搜集对应命令快捷键1、基础快捷键1.1、无处不在的跳转项目之间的跳转1.1.1、项目项目之间
- 本文实例为大家分享了opencv实现轮廓高斯滤波平滑的具体代码,供大家参考,具体内容如下一个小测试的题目:在图像上点选,找到与点选处相邻的颜
- 首先给出一段代码:public class AslistMethod { public static void main(String[]
- Android中的异步消息机制分为四个部分:Message、Handler、MessageQueue和Looper。其中,Message是线
- 本文实例讲述了Jaxb2实现JavaBean与xml互转的方法。分享给大家供大家参考,具体如下:一、简介JAXB(Java Architec
- 在项目中经常要用到将字符串解析成Locale,但是没有一个比较好用的类。java本身提供了3个构造函数,但是实际使用过程中,需要自己解析,比
- 前言环境: flutter sdk v1.7.8+hotfix.3@stable对应 flutter engine: 54ad777f这里关