victory的博客

长安一片月,万户捣衣声

0%

Redis | Jedis实现手机号验证码

Jedis实现手机号验证码


要求
1.输入手机号,点击发送后随机生成6位数字码,2分钟有效
2.输入验证码,点击验证,返回成功或失败
3.每个手机号每天只能输入3次

1.index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script  src="/Verify_code/static/jquery/jquery-3.1.0.js" ></script>
<link href="/Verify_code/static/bs/css/bootstrap.min.css" rel="stylesheet" />
<script  src="/Verify_code/static/bs/js/bootstrap.min.js"   ></script>

</head>
<body>
   <div class="container">
        <div class="row">
            <div id="alertdiv" class="col-md-12">
                  <form class="navbar-form navbar-left" role="search" id="codeform">
                  <div class="form-group">
                    <input type="text" class="form-control" placeholder="填写手机号" name="phone_no">
                    <button type="button" class="btn btn-default" id="sendCode">发送验证码</button><br>
                    <font id="countdown" color="red" ></font>
                    <br>
                    <input type="text" class="form-control" placeholder="填写验证码" name="verify_code">
                    <button type="button" class="btn btn-default" id="verifyCode">确定</button>
                    <font id="result" color="green" ></font><font id="error" color="red" ></font>
                    </div>
                    </form>
    </div>
   </div>
  </div>

</body>
<script type="text/javascript"> 
var t=120;//设定倒计时的时间 
var interval;
function refer(){  
    $("#countdown").text("请于"+t+"秒内填写验证码 "); // 显示倒计时 
    t--; // 计数器递减 
    if(t<=0){
        clearInterval(interval);
        $("#countdown").text("验证码已失效,请重新发送! ");
    }
} 

$(function(){
    $("#sendCode").click( function () {
           
           $.post("/Verify_code/CodeSenderServlet",$("#codeform").serialize(),function(data){
             if(data=="true"){
                 t=120;
                 clearInterval(interval);
                 interval= setInterval("refer()",1000);//启动1秒定时  
             }else if (data=="limit"){
                clearInterval(interval);
                $("#countdown").text("单日发送超过次数! ")
             }
          });   
    });
    
    $("#verifyCode").click( function () {
        
           $.post("/Verify_code/CodeVerifyServlet",$("#codeform").serialize(),function(data){
             if(data=="true"){
                 $("#result").attr("color","green");
                 $("#result").text("验证成功");
                 clearInterval(interval);
                 $("#countdown").text("");
             }else{
                 $("#result").attr("color","red");
                 $("#result").text("验证失败");
             }
          });   
    });
    
    
});
</script>
</html>

2.CodeSenderServlet.java(发送验证码)

@WebServlet("/CodeSenderServlet")
public class CodeSenderServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CodeSenderServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //获取手机号
        String phone_no = request.getParameter("phone_no");
        //获取验证码
        String code = getCode(6);
        //拼接key
        String codeKey = "Verify_code:" + phone_no + ":code";//Verify_code:12345:code
        String countKey = "Verify_code:" + phone_no + ":count";
        
        Jedis jedis = new Jedis("192.168.44.132", 6379);
        //判断发送验证码的次数
        String count = jedis.get(countKey);
        if(count == null) {
            //代表第一次
            jedis.setex(countKey, 24*60*60, "1");
        }else if(Integer.parseInt(count) <= 2) {
            jedis.incr(countKey);
        }else if(Integer.parseInt(count) > 2) {
            response.getWriter().print("limit");
            jedis.close();
            return ;
        }
        
        //向redis中进行存储,以手机号为键,以验证码为值
        jedis.setex(codeKey, 120, code);
        jedis.close();
        response.getWriter().print(true);
        
    }
    
    
    private String getCode(int length) {
        String code = "";
        Random random = new Random();
        for(int i = 0; i < length; i++) {
            int rand = random.nextInt(10);
            code += rand;
        }
        return code;
    }

}

3.验证

@WebServlet("/CodeVerifyServlet")
public class CodeVerifyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CodeVerifyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //获取验证码和手机号
        String phone_no = request.getParameter("phone_no");
        String verify_code = request.getParameter("verify_code");
        //拼接key
        String codeKey = "Verify_code:" + phone_no + ":code";
        //从redis中获取手机号所对应的验证码
        Jedis jedis = new Jedis("192.168.44.132", 6379);
        String code = jedis.get(codeKey);
        if(code.equals(verify_code)) {
            response.getWriter().print(true);
        }
        jedis.close();
        
    }

}