一、找到一个短信API服务数据接口
使用短信api接口服务我这里是使用一个第三方的接口服务(步骤需要不是打广告)。
1、获取短信接口的Appkey程序钥匙。
注册账号>找到个人中心
请先复制好你的接口密码,到后面我们要用到
提交审核-往下滑找到你刚刚提交的短信:
请复制好你的短信模板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); } }
代码打完了,只要等待我们的短信模板通过就可以使用了,然后就开始测试吧
测试结果
由于写的比较着急,所以很多细节没有优化,请勿见怪。