JAVA实现注册登陆的短信验证

一、找到一个短信API服务数据接口

  使用短信api接口服务我这里是使用一个第三方的接口服务(步骤需要不是打广告)。

  1、获取短信接口的Appkey程序钥匙。

    https://www.juhe.cn/

    注册账号>找到个人中心

请先复制好你的接口密码,到后面我们要用到

提交审核-往下滑找到你刚刚提交的短信:

请复制好你的短信模板ID

二、代码实现

  好的,我们拿到了短信的模板编号、短信接口密码。现在我们就开始打代码了

创建util工具类,在URL地址中输入你的短信模板编号,和你的短信接口密码

/**
 * 调用短信接口的类
 * @author YangWanSheng
 *
 */
public class SMSCode {
    //提取手机号码生成的验证码
    public static boolean sendCode(String phoneNumber , String code )throws Exception{
        String code_Str = URLEncoder.encode("#code#="+code, "utf-8");
        System.out.println(code_Str);
        //准备URL对象,将接口包装在此对象中
        URL url = new URL("http://v.juhe.cn/sms/send?mobile="+phoneNumber+
                "&tpl_id=你的短信模板ID编号&tpl_value="+code_Str+"&key=你的短信接口密码");
        //打开对象
        URLConnection connection = url.openConnection();
        //向服务器发送连接请求
        connection.connect();
        //获得服务器响应的数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
        StringBuffer buffer = new StringBuffer();
        String lineData = null;
        while((lineData=bufferedReader.readLine())!=null) {
            buffer.append(lineData);
        }
        System.out.println(buffer);
        //关闭连接对象
        bufferedReader.close();
        if(buffer.toString().indexOf("\"erroe_code\":0")>=0) {
       //执行成功了,短信已经成功的发送到了用户的手机了
return true; } return false; } }

网页前台代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>短信测试</title>
</head>
<body>
    <form action="Login" method="post">
        <input type="text" id="phoneNUmber" name="phoneNumber" 
        placeholder="手机号码" pattern="^1[3|5|8]\d{9}$" required="required">
        
        <input type="text" name="code" placeholder="验证码" required="required" >
        
        <button type="button" id="btnSendCode">发送验证码</button>
        <button type="submit">开始登陆</button>
    </form>
    <script type="text/javascript">
        document.getElementById("btnSendCode").addEventListener("click",function(){
            var Number = document.getElementById("phoneNUmber").value;
            window.open("register?phoneNUmber="+Number);
            window.alert('验证码已经发送了,请注意接收!');
        },false);
    </script>
</body>
</html>

当用户点击“发送验证码”按钮时开始向用户手机发送验证码的server控制类编写

package com.service;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.Util.SMSCode;

/**
 *  开始获取手机验证码
 * @author YangWanSheng
 *
 */
@WebServlet("/register")
public class Register extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public Register() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String phoneNumber = request.getParameter("phoneNUmber");//用户发送的手机号码
        System.out.println(phoneNumber);
        //验证手机号码
        if(phoneNumber.trim().equals("") || phoneNumber == null) {
            System.out.println("手机号码为空");
            response.sendRedirect("message.html");//重定向回到页面
            return;
        }
        if(!Pattern.matches("^1[3|5|8]\\d{9}$", phoneNumber)) {
            System.out.println("手机号码格有误!");
            response.sendRedirect("message.html");//重定向回到页面
            return;
        }
        //开始生成随机数字 -- 验证码
        StringBuffer buffer = new StringBuffer();
        Random random = new Random(); //随机数字
        for(int i =0;i<6 ;i++) {
            buffer.append(random.nextInt(10));//得到六位随机数字
        }
        System.out.print(buffer.toString());//控制台输出查看验证码
        //设置写入网页编码
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();//写入流
        try {
            if(!SMSCode.sendCode(phoneNumber, buffer.toString())) {
                out.println("验证码发送失败,请重试");//提示用户,这个错误可能服务出错也不排除我们的SMSCode类代码出错
            }else {
          //把我们的验证码、手机号码和当前的系统时间存入session用于验证用户输入的验证码是否一致、是否超出了时间限制 request.getSession().setAttribute(
"code", buffer.toString());//验证码 request.getSession().setAttribute("number", phoneNumber);//手机号码 request.getSession().setAttribute("time", System.currentTimeMillis());//系统时间 out.println("验证码发送成功!,等待幸福的短信铃声吧!"); } }catch(Exception e) { e.printStackTrace(); } out.close();//关闭输出流 } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }

LoginServers控制器类编写

package com.service;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 开始验证,验证码是否正确,手机号码是否正确
 * @author YangWanSheng
 *
 */
@WebServlet("/Login")
public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Login() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String phoneNumber = request.getParameter("phoneNumber");//用户手机号码
        String code = request.getParameter("code");//用户输入的验证码
        //手机号码、验证码的非空验证、格式验证
        if(phoneNumber ==null || phoneNumber.trim().equals("")) {
            System.out.println("手机号码为空!");
            response.sendRedirect("message.html");
            return ;
        }
        if(code == null || code.trim().equals("")) {
            System.out.println("验证码为空");
            response.sendRedirect("message.html");
            return ;
        }
        if(!Pattern.matches("^1[3|5|8]\\d{9}$", phoneNumber)) {
            System.out.println("手机格式有误");
            response.sendRedirect("message.html");
            return ;
        }
        //取出session中的数据,并且清空session
        HttpSession session = request.getSession();
        String code_Session = (String)session.getAttribute("code");
        String number = (String)session.getAttribute("number");
        Long time = (Long)session.getAttribute("time");
        
        session.removeAttribute("code");//清除session
        session.removeAttribute("number");
        session.removeAttribute("time");
        if(code_Session == null || code_Session.trim().equals("")) {
            System.out.println("验证码为空!");
            response.sendRedirect("message.html");
            return ;
        }
        //判断验证码是否超过10分钟
        if((System.currentTimeMillis() - time) / 1000 / 60 >=10) {
            System.out.println("对不起,验证码已经过期");
            response.sendRedirect("message.html");
            return ;
        }
        //验证提交时手机号码和获取验证码的手机号码是否一致
        if(!number.trim().equalsIgnoreCase(phoneNumber)) {
            System.out.println("手机号码与获取验证码的不一致");
            response.sendRedirect("message.html");
            return ;
        }
        //验证验证码输入是否正确
        if(code_Session.trim().equalsIgnoreCase(code)) {
            System.out.println("验证通过!");
            PrintWriter prin = response.getWriter();
            prin.println("<script>window.alert('注册成功');</script>");
            prin.close();
        }else {
            System.out.println("验证码不一致!");
            response.sendRedirect("message.html");
            return ;
        }
        
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

代码打完了,只要等待我们的短信模板通过就可以使用了,然后就开始测试吧

测试结果

由于写的比较着急,所以很多细节没有优化,请勿见怪。

猜你喜欢

转载自www.cnblogs.com/yangWanSheng/p/9665616.html