需求分析: 输入手机号,点击发送后返回6位数字码,2分钟有效。用户输入验证码,点击验证,返回成功或失败,每个手机号每天只能输入3次,0点刷新次数。
package com.wenbin.jedis; import redis.clients.jedis.Jedis; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Random; import java.util.Scanner; /** * 1、输入手机号,点击发送后随机生成6位数字码,2分钟有效 * 2、输入验证码,点击验证,返回成功或失败 * 3、每个手机号每天只能输入3次 * * @author wenbin */ public class PhoneCode { //随机数 private static final Random random = new Random(); public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入您的手机号"); String photo = input.next(); String code = sendCode(photo); //次数用完 退出 不再执行验证操作 if (code.length() == 0) { System.out.println("您今天的验证码发送次数已经用完"); return; } System.out.println("您收到的验证码是" + code); System.out.println("请输入您的验证码"); String inCode = input.next(); boolean flag = checkCode(photo, inCode); System.out.println((flag) ? "验证码正确" : "验证码错误"); } /** * 检查输入的验证码是否与发送的一致 * * @param photo 手机号 * @param inCode 输入的验证码 * @return true正确 false错误 */ private static boolean checkCode(String photo, String inCode) { //获取redis链接 Jedis jedis = getJedis(); //该手机号验证码key String codeKey = photo + "code"; //拿出redis中存入的验证码 String codeValue = jedis.get(codeKey); //关闭redis连接 closeJedis(jedis); //返回两个是否相等 return inCode.equals(codeValue); } /** * 发送验证码 一天最多三次 * * @param photo 手机号 * @return 返回验证码 */ private static String sendCode(String photo) { //获取redis链接 Jedis jedis = getJedis(); //该手机号已发送次数key String countKey = photo + "count"; //该手机号已发送次数value,如果没有返回null把他改为0 有则返回已发送次数 String countValue = (jedis.get(countKey) == null) ? "0" : jedis.get(countKey); if (Integer.parseInt(countValue) >= 3) { return ""; } //下面代码表示正常发送验证码 //计算当前时间还有多少秒到24点 用作每天验证次数刷新 存储redis中设置key有效时间 Calendar nowDate = Calendar.getInstance(); Calendar nextDayDate = new GregorianCalendar(nowDate.get(Calendar.YEAR), nowDate.get(Calendar.MONTH), nowDate.get(Calendar.DATE) + 1); long s = (nextDayDate.getTimeInMillis() - nowDate.getTimeInMillis()) / 1000; //在redis中设置到24.过期的key 值为每日验证码发送次数 jedis.setex(countKey, (int) s, String.valueOf(Integer.parseInt(countValue) + 1)); //该手机号验证码key String codeKey = photo + "code"; //该手机号验证码value,六位数随机生成 String codeValue = getCode(); //在redis中设置120s过期的key 值为验证码 jedis.setex(codeKey, 2 * 60, codeValue); //关闭redis连接 closeJedis(jedis); return codeValue; } /** * 生成六位数字验证码 * * @return 六位数字验证码 */ private static String getCode() { //生成1000000-99999左闭右闭的随机数 int code = random.nextInt(1000000) % (1000000 - 99999 + 1) + 99999; return String.valueOf(code); } /** * 获取redis连接 * * @return redis连接 */ public static Jedis getJedis() { return new Jedis("192.168.188.100", 6379); } /** * 关闭redis连接 * * @param jedis 要关闭的redis连接 */ public static void closeJedis(Jedis jedis) { jedis.close(); } }