用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");
}

</span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> getValidation(String tel) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">主机、端口</span>
    Jedis jedis = <span style="color: rgba(0, 0, 255, 1)">new</span> Jedis("myhost", 6379<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">密码</span>
    jedis.auth("mypassword"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取电话号码</span>
        String phoneNo =<span style="color: rgba(0, 0, 0, 1)"> tel;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">本人用1库进行测试</span>
        jedis.select(1<span style="color: rgba(0, 0, 0, 1)">);
        String countKey </span>= phoneNo + ":count"<span style="color: rgba(0, 0, 0, 1)">;
        String codeKey </span>= phoneNo + ":code"<span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取指定的电话号码发送的验证码次数</span>
        String cnt =<span style="color: rgba(0, 0, 0, 1)"> jedis.get(countKey);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对次数进行判断</span>
        <span style="color: rgba(0, 0, 255, 1)">if</span> (cnt == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">没有发送过验证码</span>
            jedis.setex(countKey, 60 * 60 * 24, "1"<span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发送验证码,假设生成的验证码</span>
            StringBuffer code = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuffer();
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; 6; i++<span style="color: rgba(0, 0, 0, 1)">) {
                code.append(</span><span style="color: rgba(0, 0, 255, 1)">new</span> Random().nextInt(10<span style="color: rgba(0, 0, 0, 1)">));
            }
            System.out.println(</span>"code:" +<span style="color: rgba(0, 0, 0, 1)"> code);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">缓存中添加验证码</span>
            jedis.setex(codeKey, 60 * 2<span style="color: rgba(0, 0, 0, 1)">, code.toString());
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Integer.parseInt(cnt) &lt; 3<span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发送验证码,假设生成的验证码</span>
                StringBuffer code = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuffer();
                </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; 6; i++<span style="color: rgba(0, 0, 0, 1)">) {
                    code.append(</span><span style="color: rgba(0, 0, 255, 1)">new</span> Random().nextInt(10<span style="color: rgba(0, 0, 0, 1)">));
                }
                System.out.println(</span>"code:" +<span style="color: rgba(0, 0, 0, 1)"> code);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">缓存中添加验证码</span>
                jedis.setex(codeKey, 60 * 2<span style="color: rgba(0, 0, 0, 1)">, code.toString());
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">递增手机发送数量</span>

jedis.incr(countKey);
}
else {
//返回超出 3 次,禁止发送
System.out.println("超出 3 次,禁止发送");
}
}
}
catch (Exception e) {
//这边其实是需要回滚下 redis
e.printStackTrace();
}
finally {
//关闭 redis
if (jedis != null) {
jedis.close();
}
}
}

</span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> checkValidation(String code, String tel) {
    Jedis jedis </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedis </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Jedis("myhost", 6379<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">密码</span>
        jedis.auth("mypassword"<span style="color: rgba(0, 0, 0, 1)">);
        jedis.select(</span>1<span style="color: rgba(0, 0, 0, 1)">);
        String codeKey </span>= tel + ":code"<span style="color: rgba(0, 0, 0, 1)">;
        String validation </span>=<span style="color: rgba(0, 0, 0, 1)"> jedis.get(codeKey);
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (validation == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            System.out.println(</span>"验证码未发送或者失效"<span style="color: rgba(0, 0, 0, 1)">);
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (validation.equals(code)) {
                System.out.println(</span>"验证成功"<span style="color: rgba(0, 0, 0, 1)">);
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                System.out.println(</span>"验证失败"<span style="color: rgba(0, 0, 0, 1)">);
            }
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        e.printStackTrace();
    } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (jedis != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            jedis.close();
        }
    }
}

}