手机验证码执行流程

验证码流程

1、单击“获取短信验证”按钮,将会对手机号进行非“空”判断。

  a) 如果为空,给出提示:请输入手机号。

  b) 如果不为空,判断手机号是否符合规则,不符合给出“手机号不符合规则”提示

  c) 当手机号不为空并且符合规则,就进行第二步

2、弹出验证码输入框。

  a) 页面随机生成4位验证码(包括数字与字母)并且将手机号存放在cookie里面

  b) 用户输入验证码,并且单击“确定”按钮,将会对验证码进行非“空”与匹配判断

  c) 如果验证码为空或不匹配,则按钮不对其反应。

  d) 如果不为空且验证码匹配,则向后台发送请求(带有手机号参数),请求“发送短 信”

  e) 用户收到短信验证码。并且输入验证码,点击完成注册。后台将会对手机号,验证 码进行判断。当验证码与手机号不匹配,会给出提示。当两个匹配时,将注册成功。

jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>My JSP ‘index.jsp‘ starting page</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript" src="js/jquery-1.7.js"></script>
	<script type="text/javascript">
	function getPhoneCode(){
		var phoneNum=document.getElementById("phone").value;
		if(phoneNum == ""){
			alert("请输入手机号");
		}else{
			refresh_code();
		}
	}
	function refresh_code(){
			var yy1 = getRand();
			var phoneNum=document.getElementById("phone").value;
			document.getElementById("logcode").value="";
			$("#mg").attr("src",‘yanzheng1.jsp?yy=‘+yy1+‘&phone=‘+phoneNum);
	}
	function getRand(){
    	var str="0123456789abcdefghijklmnopqrstuvwxyz";
	    var a="";
	   	for(i=0;i<4;i++){
	   		a+=str.charAt(parseInt(Math.random()*36))
	   	}
	   	return a;
   }
   function chk(){
   		var code_value = document.getElementById("code").value;
   		var code_src = document.getElementById("mg").src;
   		var yy = code_src.substring(code_src.indexOf(‘=‘)+1,code_src.lastIndexOf(‘&‘));
   		if(code_value != yy){
   			return;
   		}else{
   			jQuery("#logcode").attr("disabled", false);
			getOneCode();
   		}
   }

   function getOneCode(){
   		alert("将手机号存放在cookie中");
   		var phoneNum=document.getElementById("phone").value;
   		setCookie("phoneNumber",phoneNum);
   		//var strCookie = getCookie("phoneNumber");
		//alert(strCookie);
   		alert("发送短信验证码");
   		$.post("${pageContext.request.contextPath}/SendPhoneCode?method=sendMS",{phoneNumber:phoneNum},function(data){
   			jQuery("#btn").attr("disabled", true);
   			updateTimeLabel(60);
   		});
   }

   function updateTimeLabel(time) {
	    var btn = jQuery("#btn");
	    var a_sendcode = jQuery("#logcode");
	    btn.val(time <= 0 ? "免费获取验证码" : ("" + (time) + "秒后点击重新发送"));
	    var hander = setInterval(function () {
	        if (time <= 0) {
	            clearInterval(hander);
	            hander = null;
	            btn.val("免费获取验证码");
	            btn.attr("disabled", false);
	            a_sendcode.attr("disabled", false);
	            jQuery("#strVcodeTip").text("");
	        }
	        else {
	            btn.val("" + (time--) + "秒后点击重新发送");
	        }
	    }, 1000);
	}

   //写cookies
	function setCookie(name,value)
	{
	    var Days = 30;
	    var exp = new Date();
	    exp.setTime(exp.getTime() + Days*24*60*60*1000);
	    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
	}
   //读取cookies
	function getCookie(name)
	{
	    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
	    if(arr=document.cookie.match(reg))
	        return unescape(arr[2]);
	    else
	        return null;
	}
   function register(){
   		$.ajax({
   			type:"post",
   			url:"${pageContext.request.contextPath}/SendPhoneCode?method=register",
   			data:{"phoneNumber":$("#phone").val()},
   			success:function(data){
   				alert(data);
   			}
   		});
   		alert("注册");
   }
	</script>
	</head>
	<body>
		手机号:<input type="text" id="phone" name="phoneNumber" value=""><br>
		手机验证码:<input type="text" id="logcode" disabled="disabled" value="">
		<input type="button" id="btn" onclick="getPhoneCode()" value="免费获取验证码" /><br>
		<script type="text/javascript">
			document.write("<img id=‘mg‘ class=‘codeNumber‘ onclick=‘refresh_code()‘>");
		</script>
		<h1></h1>
		验证码:<input type="text" id="code"  value="" /><br>
		<input type="button" id="btn2" onclick="chk()" value="确定">
		<hr>
		<input type="button" id="all_btn" onclick="register()" value="注册">
	</body>

</html>

yanzheng1.jsp用于画图

<%@ page contentType="application/jpg;charset=gbk" %>
<%@ page  import="java.awt.*" %>
<%@ page  import="java.awt.image.*" %>
<jsp:directive.page import="javax.imageio.ImageIO"/>
<%
	BufferedImage img=new BufferedImage(60,26,BufferedImage.TYPE_USHORT_555_RGB);
	Graphics g=img.createGraphics();
	g.setColor(Color.decode("#f0f0f0"));
	g.fillRect(0,0,60,26);
	String a=request.getParameter("yy");
	session.setAttribute("yy",a);
	g.setFont(new Font("黑体",Font.BOLD,20));
	g.setColor(Color.decode("#3a8cd5"));
	g.drawString(a,5,20);
	for(int i=0;i<3;i++){
		int j=(int)(Math.random()*256);
		int k=(int)(Math.random()*256);
		int l=(int)(Math.random()*256);
		int x1=(int)(Math.random()*61);
		int y1=(int)(Math.random()*31);
		int x2=(int)(Math.random()*61);
		int y2=(int)(Math.random()*31);
		Color m=new Color(j,k,l);
		g.setColor(m);
		g.drawLine(x1,y1,x2,y2);
	}
	ImageIO.write(img,"jpg",response.getOutputStream());
	out.clear();
    out = pageContext.pushBody();
%>

servlet简单的测试代码

package com.yanzheng;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SendPhoneCode extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getParameter("method");
		if(method.equals("sendMS")){
			sendMS(request, response);
		}
		if(method.equals("register")){
			register(request, response);
		}
	}

	public void register(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		String phoneNum = request.getParameter("phoneNumber");
		Cookie[] cookies = request.getCookies();
		String testPhoneNum="";
		for(int i=0;i<cookies.length;i++){
			if(cookies[i].getName().equals("phoneNumber")){
				System.out.println(cookies[i].getValue());
				testPhoneNum=cookies[i].getValue();
			}
		}
		if(!phoneNum.equals(testPhoneNum)){
			response.getWriter().write("该手机号码与验证码不匹配!");
		}else{
			response.getWriter().write("注册成功!");
		}

	}

	public void sendMS(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Cookie[] cookies = request.getCookies();
		String phoneNum = request.getParameter("phoneNumber");
		String testPhoneNum="";
		for(int i=0;i<cookies.length;i++){
			if(cookies[i].getName().equals("phoneNumber")){
				System.out.println(cookies[i].getValue());
				testPhoneNum=cookies[i].getValue();
			}
		}
		System.out.println(testPhoneNum.equals(phoneNum));
	}

}
时间: 2024-08-02 15:12:17

手机验证码执行流程的相关文章

Spring Security 实现手机验证码登录

思路:参考用户名密码登录过滤器链,重写认证和授权 示例如下(该篇示例以精简为主,演示主要实现功能,全面完整版会在以后的博文中发出): 由于涉及内容较多,建议先复制到本地工程中,然后在细细研究. 1.   新建Maven项目  sms-code-validate 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchem

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. 后台服务器漏洞绕过法

ajax与php小谈(手机验证码)

在项目中碰到一个写手机验证码的问题,所以写出来: 这是前段页面,使用ajax发送了一个json格式的手机号码过去 <script src="jquery-1.11.1.min.js" type="text/javascript"></script>   <script type="text/javascript">   var InterValObj;       //timer变量,控制时间   var co

死磕 java线程系列之线程池深入解析——未来任务执行流程

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普通任务的执行流程,但其实线程池中还有一种任务,叫作未来任务(future task),使用它您可以获取任务执行的结果,它是怎么实现的呢? 建议学习本章前先去看看彤哥之前写的<死磕 java线程系列之自己动手写一个线程池(续)>,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些. 问题

死磕 java线程系列之线程池深入解析——定时任务执行流程

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ScheduledThreadPoolExecutor定时线程池类. 简介 前面我们一起学习了普通任务.未来任务的执行流程,今天我们再来学习一种新的任务--定时任务. 定时任务是我们经常会用到的一种任务,它表示在未来某个时刻执行,或者未来按照某种规则重复执行的任务. 问题 (1)如何保证任务是在未来某个时刻才被执行? (2)如何保证任务按照某种规则重复执行? 来个栗子 创建一个定时线程池,用它来

手机验证码常见漏洞总结

0X00 前言 手机验证码在web应用中得到越来越多的应用,通常在用户登陆,用户注册,密码重置等业务模块用手机验证码进行身份验证.针对手机验证码可能存在的问题,收集了一些手机验证码漏洞的案例,这里做一个归纳总结,在测试中,让自己的思路更加明确.常见的手机验证码漏洞如下: 1.无效验证 2.客户端验证绕过 3.短信轰炸 4.验证码爆破 5.验证码与手机号未绑定 0X01 无效验证 有验证码模块,但验证模块与业务功能没有关联性,此为无效验证,一般在新上线的系统中比较常见. 案例一: 获取短信验证码后

python学习之内部执行流程,内部执行流程,编码(一)

python的执行流程: 加载内存--->词法分析--->语法分析--->编译--->转换字节码---->转换成机器码---->供给CPU调度 python的编码: 1. ASCII    2的256次表示. 2. UNICODE  最好16位表示2字节 3. UTF-8 能就8位表示就用8位表示,节省资源. python的注释: 字符 '#': 只注释一行 字符"  '''  ":注释多行 python的教程参数: 用 sys模块 的argv参数,

(一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习

ThinkPHP作为国内具有代表性的PHP框架,经过多年的发展,受到越来越多公司与开发者的青睐.我也在忙里偷闲中抽出部分时间,来学习这个优秀的框架.在开始学习这个框架时,最好通过实例来学习,更容易结合实际的生产情况,促进学习的效果:这里我就选择由ThinkPHP团队开发的基于ThinkPHP3.2的内容管理框架OneThink来学习,从了解它的执行流程→熟悉流程中各个细节→了解模版标签→自己实际去使用标签→再了解它的实际执行过程……通过这样一个流程来熟悉如何基于ThinkPHP开发出一套CMS系

使用Caffe进行手写数字识别执行流程解析

之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examples实现对手写数字进行识别,这里详细介绍下其执行流程并精简了实现代码,使用Caffe对MNIST数据集进行train的文章可以参考  http://blog.csdn.net/fengbingchun/article/details/68065338 : 1.   先注册所有层,执行layer_factory.hpp中类LayerRegis