Springboot+redis实现手机短信验证功能
项目创建
spring initializr 地址:https://start.springboot.io
添加依赖
因为我这里是学习阶段 没用官方的redis集成依赖
业务需求
用户在客户端输入手机号,点击发送后随机生成4位数字码。有效期为60秒。
输入验证码,点击验证,返回成功或者失败。
且每个IP地址。在5分钟内只能验证3次。并给相应信息提示。锁定这个IP 12小时。
需求流程
需求1流程:
后台Redis生成一个KEY,value:验证码4位数字码。 (过期时间60秒) expire。
前端用户输入的验证码和后台生成的Redis key验证码进行比较,
如果不相等:
验证码校验失败,
如果相等:恭喜你,注册成功。
spring:
redis:
database: 0
host: 192.168.190.145
password: 317311
port: 6379
timeout: 2000
jedis: # jedis连接池配置
pool:
max-idle: 10
min-idle: 0
max-active: 10
max-wait: 2000
config配置类
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
public class JedisConfig {
/**
* 数据库
*/
@Value("${spring.redis.database}")
private int database;
/**
* ip地址
*/
@Value("${spring.redis.host}")
private String host ;
/**
* 密码
*/
@Value("${spring.redis.password}")
private String password;
/**
* 端口号
*/
@Value("${spring.redis.port}")
private int port;
/**
* 等待时间
*/
@Value("${spring.redis.timeout}")
private int timeout;
/** 最大连接数*/
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
/** 最大空闲数*/
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
/** 最小空闲数*/
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
/**
* jedis连接池的配置 (得到jdbc连接池)
* @return
*/
@Bean
public JedisPool jedisPool(){
/*
连接池的配置
*/
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxTotal(maxActive);
JedisPool jedisPool = new JedisPool(poolConfig,host,port,timeout,password);
return jedisPool;
}
}
controller层
@RestController
@Slf4j
public class PhoneValidateController {
/**
* 手机验证码过期时间
*/
static int PHONE_NUMBER_CODE_EXPIRE_SECONDS=60;
/**
* redis连接池
*/
@Autowired
private JedisPool jedisPool;
/**
* 生成四位数验证码
* @return 验证码
*/
public int generatorCode(){
return (int) (Math.random()*10000);
}
/**
* 获取验证码
* @param phone 手机号码
* @return
*/
@RequestMapping("/getValidataCode")
public String getValidataCode(String phone){
// 随机生成的验证码
String verificationCode= String.valueOf(generatorCode());
String key = "phone:code:"+phone;
// 得到jedis连接
Jedis jedis = jedisPool.getResource();
// 不存在 设置key 存在 验证value
if (!jedis.exists(key)){
log.info("验证码已发送"+verificationCode);
jedis.setex(key,PHONE_NUMBER_CODE_EXPIRE_SECONDS,verificationCode);
jedis.close();
return "验证码已发送";
}else {
Long timeNum = jedis.ttl(key);
if (timeNum==-2){
jedis.del(key);
}
jedis.close();
return "验证码获取失败,请避免重复获取 还剩"+timeNum+"秒";
}
}
/**
* 验证验证码
* @param phone 手机号码
* @param verificationCode 用户输入的验证码
* @return
*/
@GetMapping("/verifyVerificationCode")
public String verifyVerificationCode(String phone,@RequestParam("code") String verificationCode){
//获取jedis连接
Jedis jedis = jedisPool.getResource();
String key = "phone:code:"+phone;
String code = jedis.get(key);
if (code.equals(verificationCode)){
return "登陆成功";
}else {
return "验证码错误";
}
}
}
前端页面
我这里的前端页面很简陋 本人技术有限
需要导入jquery依赖
注册
注册手机号:
验证码:
```