验证码---短信验证码

最近自学了短信的验证码实现。以下是自己用的一种方法实现的完整的过程。

短信验证登陆(前端+后台)

1、前端填写手机号以及点击触发,以电话号码为参数调用发送验证登录短信方法并在前端产生随机数存于Seesion 中,将手机号连同产生的随机数发送到后台操作(已经设置好缓存存放时间)

2、调用发送模板短信方法发送短信(设置好短信中验证码有效的时间)

3、点击触发登陆,调用对应验证登录函数 ,以电话号码和验证码为参数

4、校验缓存中对应保留的信息
如果一致,登陆成功;
登陆不成功是返回原因(1、超时 2、验证码输入错误)

实现:

我的实现是利用网易云信实现的。

1.    注册网易云信

2.    创建IM 应用

3.    一般首次注册会有免费的短信条数,不用去购买

4.    创建一个短信模板,等待审核

5.    在自己创建的IM 应用中找到 App Key管理把相应的Appkey和appSecret放入到代码中

由于使用的网易云信得短信验证故无法得知他把我们获取到的验证码放置在了何处,故在这里的校验验证码我们也只能交给网易云信来判断,我们只能对写出后台代码来传送给网易云信,主要是若想真正的实现验证我们需要一个api的接口来实现。

下面是一个简单的短信验证的例子(包括了对短信获取到的验证码的验证)

1、 前端代码(html)

<%@ 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=UTF-8">

<title>短信验证码实现</title>

<link rel="stylesheet" href="css/bootstrap.css">

<link rel="stylesheet" href="css/_phone.css">

<script type="text/javascript" src="js/jquery.js"></script>

<script type="text/javascript" src="js/bootstrap.js"></script>

<script type="text/javascript" src="js/_phone.js"></script>

</head>

<body>

      <div id="bodys">

                 <div id="top">

                      <div id="left">

                            手机号:<input type="text" id="phoneNum" name="phone" onblur="checkNum()" value="${phone }">

                      </div>

                      <div id="right">

                            <input type="text" id="errormessage" style="display: none;">

                      </div>

                 </div>

                 <div id="foot">

                      验证码:<input type="text" id="confirmNum" onclick="checkCode()">                

                      <input type="hidden" id="test" value="${phone }+${number }">

                      <input type="button" class="btn-primary" value="获取验证码" name="number" id="gettime">

                 </div>

                 <div id="tool">

                      <input type="submit" class="btn-primary" value="登陆" onclick="logins()">

                 </div>

      </div>

</body>

</html>

2. 前端代码(jsp+css)

/*检查手机号是否正确*/

function checkNum() {

      if ($("#phoneNum").val() == null || $("#phoneNum").val() == "") {

           $("#errormessage").css({

                 "display" : "block",

                 "border" : "none",

                 "color" : "red"

           });

           $("#errormessage").val("手机号不能为空!");

      } else if (!(/^1[3|5|8|4][0-9]\d{4,8}$/.test($("#phoneNum").val()))) {

           /* 正则表达式判断手机号是否符合标准 */

           $("#errormessage").css({

                 "display" : "block",

                 "border" : "none",

                 "color" : "red"

           });

           $("#errormessage").val("手机号格式不对!");

      } else {

           $("#errormessage").css({

                 "display" : "block",

                 "border" : "none",

                 "color" : "green"

           });

           $("#errormessage").val("√");

      }

}

//先随机产生4位数字,保存到数据库,然后发送到手机上

var number;

// 倒计时

var time = 61;

var t;

// 获取验证码

$(document).ready(function() {

      $(‘#gettime‘).click(function() {

           // 先随机产生4位数字,保存到数据库,然后发送到手机上

           number = Math.floor(Math.random() * 9000) + 1000;

           t = setInterval("gettime()", 1000);

           var phone = $("#phoneNum").val();     location.href="MessageSend?&phone="+$("#phoneNum").val()+"&number="+$("confirmNum").val();      alert(number+"-------"+phone);

      })

})

/*修改时间,即在时间段内没有获取到*/

function gettime() {

      time--;

      if (time > 0) {

           $(‘#gettime‘).val(time + ‘s‘);

           $(‘#gettime‘).css("color", "red");

      } else {

           $(‘#gettime‘).val(‘重新获得验证码‘);

           $(‘#gettime‘).css("color", "red");

           t = clearInterval(t);/* 清楚时间重新获取 */

           time = 61;

      }

}

/*将填写的数据传送到servlet中*/

function logins(){

      location.href="MessageCheck?&phone="+$("#phoneNum").val()+"&checknum="+$("confirmNum").val();

}

CSS

#bodys{ margin:200px auto 0px; width:450px;}

#top { height: 40px; }

#top #left{  float: left; }

#top #right{ float: right; }

#top input{ width:200px; }

#foot{ position: relative;  top: 10px; }

#tool{ position: relative;  top: 10px; }

3.发送验证码(java)

package com.mobile;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

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 org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSON;

@WebServlet("/MessageSend")

public class MessageSend extends HttpServlet {

      private static final long serialVersionUID = 1L;

      private static final String SERVER_URL = "https://api.netease.im/sms/sendcode.action";// 发送验证码的请求路径URL

      private static final String APP_KEY = "0b4828b25c0**************c41";// 网易云信分配的账号

      private static final String APP_SECRET = "5***97";// 网易云信分配的密钥

      private static final String NONCE = "123456";// 随机数

      public MessageSend() {

           super();

           // TODO Auto-generated constructor stub

      }

      protected void doGet(HttpServletRequest request, HttpServletResponse response)

                 throws ServletException, IOException {

           request.setCharacterEncoding("utf-8");

           response.setHeader("Context-type", "text/html;Charset=utf-8");

           String phone = request.getParameter("phone");

           String number = request.getParameter("number");

           //将数据再次返回给页面显示

           request.setAttribute("phone", phone);

           request.setAttribute("number", number);

           System.out.println( "phone:---"+request.getParameter("phone"));

           sendMsg(phone);

           request.getRequestDispatcher("Phone.jsp").forward(request, response);

      }

      public static String sendMsg(String phone) throws IOException {

        CloseableHttpClient httpclient = HttpClients.createDefault();

        HttpPost post = new HttpPost(SERVER_URL);

        String curTime=String.valueOf((new Date().getTime()/1000L));

        String checkSum=CheckSumBuilder.getCheckSum(APP_SECRET,NONCE,curTime);

        //设置请求的header

    post.addHeader("AppKey",APP_KEY);

        post.addHeader("Nonce",NONCE);

        post.addHeader("CurTime",curTime);

        post.addHeader("CheckSum",checkSum);    post.addHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");

        //设置请求参数

        List<NameValuePair> nameValuePairs =new ArrayList<>();

        nameValuePairs.add(new BasicNameValuePair("mobile",phone));

        post.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8"));

        //执行请求

        HttpResponse response=httpclient.execute(post);

        String responseEntity= EntityUtils.toString(response.getEntity(),"utf-8");

        //判断是否发送成功,发送成功返回true

        String code= JSON.parseObject(responseEntity).getString("code");

        if (code.equals("200")){

            return "success";

        }

        return "error";

    }

      protected void doPost(HttpServletRequest request, HttpServletResponse response)

                 throws ServletException, IOException {

           // TODO Auto-generated method stub

           doGet(request, response);

      }

}

4    验证短信验证码

com.mobile;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

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 org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSON;

/**

 * Servlet implementation class MessageCheck

 */

@WebServlet("/MessageCheck")

public class MessageCheck extends HttpServlet {

         private static final long serialVersionUID = 1L;

         private static final String SERVER_URL = "https://api.netease.im/sms/verifycode.action";// 校验验证码的请求路径URL

         private static final String APP_KEY = "0b482******1";// 网易云信分配的账号

         private static final String APP_SECRET = "5*****97";// 网易云信分配的密钥

         private static final String NONCE = "123456";// 随机数

         /**

          * @see HttpServlet#HttpServlet()

          */

         public MessageCheck() {

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

                   response.setHeader("Context-type", "text/html;Charset=utf-8");

                   String phone = request.getParameter("phone");

                   String checknum = request.getParameter("checknum");

                   checkMsg(phone,checknum);

                   request.getRequestDispatcher("index.jsp").forward(request, response);

         }

         public static String checkMsg(String phone,String sum) throws IOException {

        CloseableHttpClient httpclient = HttpClients.createDefault();

        HttpPost post = new HttpPost(SERVER_URL);

        String curTime=String.valueOf((new Date().getTime()/1000L));

        String checkSum=CheckSumBuilder.getCheckSum(APP_SECRET,NONCE,curTime);

        //设置请求的header

        post.addHeader("AppKey",APP_KEY);

        post.addHeader("Nonce",NONCE);

        post.addHeader("CurTime",curTime);

        post.addHeader("CheckSum",checkSum);

        post.addHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");

        //设置请求参数

        List<NameValuePair> nameValuePairs =new ArrayList<>();

        nameValuePairs.add(new BasicNameValuePair("mobile",phone));

        nameValuePairs.add(new BasicNameValuePair("code",sum));

        post.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8"));

        //执行请求

        HttpResponse response=httpclient.execute(post);

        String responseEntity= EntityUtils.toString(response.getEntity(),"utf-8");

        //判断是否发送成功,发送成功返回true

        String code= JSON.parseObject(responseEntity).getString("code");

        if (code.equals("200")){

            return "success";

        }

        return "error";

    }

         /**

          * @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);

         }

}

至此便可以实现短信的验证码

原文地址:https://www.cnblogs.com/sunny-su/p/10643399.html

时间: 2024-10-07 04:36:00

验证码---短信验证码的相关文章

Android EditText方框验证码 短信验证码攻略

本文由xiawe_i提供. xiawe_i的博客地址是: http://www.jianshu.com/u/fa9f03a240c6 项目中有这样一个需求: 验证码页是四个方框,输入验证码方框颜色改变,删除再变回原来颜色. 先看下效果,动图不太清晰,将就看吧 思路: 用一个透明的EditText与四个TextView重叠,并给TextView设置默认背景 监听EditText文本变化,获取输入内容,给TextView赋值并改变TextView背景 4个TextView有值后添加输入完成回调,监听

Atitit. 破解 &#160;拦截 绕过 网站 手机 短信 验证码 &#160;方式 v2 attilax 总结

Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如要求拖动等21.3. 第三代验证码 手机验证码 短信验证码22. 短信验证码的原理23. 常用破解法23.1. 漏洞绕过法23.2. 手机 软件转发法23.3. 手机api法33.4. 默认万能密码法 测试维护万能验证码33.5. 网站服务器短信发出截获33.6. 配置文件法33.7. 前端源码截获

发送短信验证码和邮箱验证码—Java实现

短信验证码 短信验证码都是调用一些接口来进行短信的发送,短信验证码在登录.注册等操作中使用的最广泛,本文这一节演示如何使用Java制作一个简单的短信验证码登录. 我这里演示使用的是聚合数据的短信接口(并非广告),因为聚合数据的接口调用比较方便和简单,所以首先得先去聚合数据里申请一个短信接口API: 申请时会需要你进行实名认证,如果你不想认证的话跳过认证也是可以的. 申请完短信API进入以下界面后点击"模板": 需要先申请一个短信模板,根据自己的需求定义这个模板内容(定义前先阅读此页面下

短信验证码逻辑

class SMSCodeView(View): """短信验证码""" def get(self, reqeust, mobile): """ :param reqeust: 请求对象 :param mobile: 手机号 :return: JSON """ # 1. 接收参数 image_code_client = reqeust.GET.get('image_code') uuid

实现短信验证码

朋友让帮忙做一个短信验证码工具,对此有了初体验. 1. 编码转换:字符集必须是GB2312格式,字符必须用UrlEncode进行编码. $sms = "短信验证码:2312[大象投资]"; // utf8 echo urlencode(mb_convert_encoding($sms,'gb2312','utf-8')); 2. 通知类短信,如果没有备案,晚上.周末等非工作时间不能发送,必须白天发送,因为那时候才有人工审查. 3. 验证码类短信,随便发,没有太多限制. 了解到上面的内容

atitit.短信&#160;验证码&#160;&#160;破解&#160;&#160;v3&#160;p34&#160;&#160;识别&#160;绕过&#160;系统方案规划----业务相关方案&#160;手机验证码&#160;&#160;.doc

atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1.1. 破解基本原则有两种,一种是绕过验证码.一种是拦截1 2. 手机 短信 验证码的 破解 拦截 方式分类2 2.1. 按照源头破解拦截分为源头拦截,中间拦截,,终端拦截...2 2.2. 按照是否软硬件可分类为 纯软件方案与软硬件结合方案2 3. 具体的方法如下2 3.1. 后台服务器漏洞绕过法

为什么验证码短信成为行业短信主流?

从十年前短信群发行业的兴起,到2010年的短信各路企业的风起云涌,还有媒体对"垃圾短信"的多次曝光,再到2013年底运营商的大刀阔斧的整顿和叫停,时至今日,短信发送业务貌似步入了正轨,同时也随着智能手机移动互联网的快速发展,包括微信和手机安全软件的迅猛普及,人们对手机短信模块的使用变得可有可无,也许好多天都不会去看短信.总之,2014年企业应用级的短信市场总体业务量大不如五年前,至少下滑了60%!      那么,当年的成千上万家的短信公司现在怎么样了呢?据调查了解,那些曾经疯狂揽金的

Android开发之属于你的短信验证码(一)

不飞则已,一飞冲天;不鸣则已,一鸣惊人---------司马迁 最近工作又有新需求,要求用户在注册的时候需要通过手机验证码,这样做的目的是防止用户通过一个邮箱来随便的注册,那么好,今天我们就 一起来学习一下Android中的短信验证码这一个知识点.如有谬误,欢迎批评指正,如有疑问欢迎留言,谢谢 在说这个知识点前,我们首先来了解下聚合数据 一.聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务.免费提供从天气查询.空气质量.地图坐标到金融基金.电商比价.违章查询等各

Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式

短信验证码在目前大多数web应用中都会有,本文介绍一个基于Yii2 Validator方式的验证码验证方式. 在其他文章中看到的方式大多比较难做到一次封装,多次重用. 使用此方式的好处自然不用多说,Validator支持在Model和Form中使用,使用的时候只需要在rules中添加一条验证规则即可. 第一步: 准备数据表,用来存储短信验证码 CREATE TABLE `tbl_sms_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `to` varch