精华内容
下载资源
问答
  • 用户登录到页面 - 输入手机号- 点击获取验证码按钮-后台生成6位随机数 - 通过第三方平台发送到手机 - 并把随机验证码放到session - 用户输入验证码 - 后台匹配手机号验证码 - 120秒后自动清空session中的验证码(用...

    用户登录到页面 - 输入手机号- 点击获取验证码按钮-后台生成6位随机数 - 通过第三方平台发送到手机 - 并把随机验证码放到session - 用户输入验证码 - 后台匹配手机号与验证码 - 120秒后自动清空session中的验证码(用java定时器)

    前台没必要展示了.

    controller:

    @RequestMapping(value="/provePhone",method=RequestMethod.POST)
    	public Object provePhone(Model model,String phone,HttpSession session) throws HttpException, IOException{
    		String msg="手机号码格式错误!";
    		if(phone.length()!=11){
    			model.addAttribute("msg", msg);
    			model.addAttribute("phone", phone);
    			return "login";
    		}else{
    			//发送随机6位验证码到手机
    			int phoneCode=SendPhoneCode.phoneCodeStart(phone);
    			//放入session
    			session.setAttribute("phone", phone);
    			session.setAttribute("phoneCode", String.valueOf(phoneCode));
    			//120秒后清除session中的验证码
    			SendPhoneCode.removeSessionPhoneCode(session);
    			msg="发送成功!请填写验证码!";
    			model.addAttribute("phong", phone);
    			model.addAttribute("msg", msg);
    		}
    		return "login";
    	}

    发送短信随机数和定时器写一个类里了.懒得分开了

    public class SendPhoneCode {
    
    	public static int  phoneCodeStart(String phone) throws HttpException, IOException {
    		Random r=new Random();
    		int i=r.nextInt(899999);
    		int a=i+100000;
    		String phoneCode="验证码:"+String.valueOf(a)+  "验证码120秒有效";
    		
    		HttpClient client = new HttpClient();
    		PostMethod post = new PostMethod("http://gbk.api.smschinese.cn");
    		post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=gbk");// 在头文件中设置转码
    		NameValuePair[] data = { new NameValuePair("Uid", "bikepark"), new NameValuePair("Key", "xxxxxxxxxxxxxxxxxxx"),
    				new NameValuePair("smsMob", phone), new NameValuePair("smsText", phoneCode) };
    		post.setRequestBody(data);
    
    		client.executeMethod(post);
    		Header[] headers = post.getResponseHeaders();
    		int statusCode = post.getStatusCode();
    		System.out.println("statusCode:" + statusCode);
    		for (Header h : headers) {
    			System.out.println(h.toString());
    		}
    		String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
    		System.out.println(result); // 打印返回消息状态
    
    		post.releaseConnection();
    		return a;
    
    	}
    	/**
    	 * 定时器 120秒后清除session中的验证码
    	 * @param session
    	 */
    	public static void removeSessionPhoneCode(HttpSession session){
    		 Timer timer = new Timer();
    		    timer.schedule(new TimerTask() {
    		      public void run() {
    		        session.removeAttribute("phoneCode");
    		      }
    		    }, 120000);// 设定指定的时间time,1秒为1000毫秒
    	}
    	
    	
    }

    再对手机验证码验证是否匹配

    @RequestMapping("/phoneCode")
    	public Object phoneCode(HttpSession session,String phone,String phoneCode,Model model){
    		String msg="";
    		if(session.getAttribute("phone").equals(phone)&&session.getAttribute("phoneCode").equals(phoneCode)){
    			msg="验证通过!";
    			model.addAttribute("phone", phone);
    			model.addAttribute("msg",msg );
    			return "login";
    		}else{
    			msg="验证未通过!";
    			model.addAttribute("phone", phone);
    			model.addAttribute("msg",msg );
    			return "login";
    		}
    	}	
    注意:两次请求的方式必须都是"POST",否则第二次验证的请求会创建一个新session就匹配不到之前的随机数了.

    对了,第三方短信平台用的"中国网建".

    展开全文
  • Time-based One-time Password algorithm, 是一种共享密钥和当前时间计算一次性密码的算法。 使用目的 利用时间戳和邮箱生成一段时间内唯一的验证码。验证时使用用户输入的验证码和一段时间内生成的验证码集合对比,...

    TOTP

    Time-based One-time Password algorithm, 是一种共享密钥和当前时间计算一次性密码的算法。

    使用目的

    利用时间戳和邮箱(或手机号)生成一段时间内唯一的验证码。验证用户输入的验证码和一段时间内生成的验证码集合对比,如果在此集合,则证明验证码有效。摆脱使用redis等方式存储和对比验证码。

    CODE

    class Totp {
        private $salt = 'salt';    // 盐
        private $refreshInterval = 30; //每隔30秒刷新验证码
        private $checkCount = 10;	//验证码集合数量 $refreshInterval x $checkCount 为验证码有效期
        private $codeLength  = 6;  //生成验证码长度
    
        public function generate(string $input) {
            return $this->trimTotp($this->genTotp($this->hashInput($input), time()));
        }
    
        public function check(string $input, string $code) {
            $hashedInput = $this->hashInput($input);
            $currentTime = time();
            for (
                $windowIndex = 0;
                $windowIndex <= $this->checkCount;
                $windowIndex++
            ) {
                if (
                    $code === $this->trimTotp(
                        $this->genTotp(
                            $hashedInput, 
                            $currentTime - ($windowIndex * $this->refreshInterval)
                        )
                    )
                ) {
                    return TRUE;
                }
            }
    
            return FALSE;
        }
        
    	private function hashInput (string $input) {
            $input = $input ? $input : $this->salt;
            return hash('sha256', md5($input) . md5($this->salt), FALSE);
        }
        
    	private function genTotp (string $hashedInput, int $timestamp) {
            $sequence = floor($timestamp / 30);
            $code = hash_hmac("sha256", $hashedInput . md5($sequence), md5($sequence), TRUE);
    
            $finalValue = 0;
            $index = 0;
    
            do {
                $finalValue += ord($code[$index]);
                $finalValue = $finalValue << 2;
                $index++;
            } while (isset($code[$index]));
    
            return $finalValue;
        }
        
    	private function trimTotp (int $sourceTotp) {
            $trimedTotp = $sourceTotp % pow(10, $this->codeLength);
            $format = "%'.0". $this->codeLength ."u";
            return sprintf($format, abs($trimedTotp));
        }
    }
    
    $email = 'xxxxxx@qq.com';
    $totp = new Totp();
    $code = $totp->generate($email);
    
    echo $code;
    
    if ($totp->check($email, $code)) {
    	echo '验证通过';
    } else {
    	echo '验证失败';
    }
    
    展开全文
  • 近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家...

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家见谅!

    一:首先上几张案例截图,以便大家可以了解一下短信验证码的流程,这里我在做的过程中也参考了很多网站的短信验证码,比如:58同城,汽车之家等。

    1.点击获取验证码之前的样式:

    2.输入正确的手机号后点击获取验证码之后的样式:

    3.如果手机号已经被注册的样式:

    4.如果一个手机号一天发送超过3次就提示不能发送:

    二:前台的注册页面的代码:reg.jsp

     

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags"%>
    <%@page import="cn.gov.csrc.base.action.FindAllData"%>
    <%
    	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>中国证券会证券期货违法违规举报中心-注册</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="shortcut icon" type="image/x-icon" href="<%=request.getContextPath()%>/images/favicon.ico" />
    <link rel="stylesheet" type="text/css"
    	href="<%=request.getContextPath()%>/css/main.css">
    <link
    	href="<%=request.getContextPath()%>/formValidator1/style/validator.css"
    	rel="stylesheet" type="text/css" />
    <style type="text/css">
    button {
    	background: #F0F0F0 repeat-x;
    	padding-top: 3px; 
    	border-top : 1px solid #708090;
    	border-right: 1px solid #708090;
    	border-bottom: 1px solid #708090;
    	border-left: 1px solid #708090;
    	width: auto;
    	line-height: 12pt; 
    	font-size : 10pt;
    	cursor: hand;
    	font-size: 10pt;
    	border-top: 1px solid #708090;
    }
    </style>
    <script src="<%=request.getContextPath()%>/js/jquery-1.7.2.min.js"
    	type="text/javascript"></script>
    <script src="<%=request.getContextPath()%>/formValidator1/formValidator-4.0.1.js"
    	type="text/javascript"></script>
    <script src="<%=request.getContextPath()%>/formValidator1/formValidatorRegex.js"
    	type="text/javascript"></script>
    <script src="<%=request.getContextPath()%>/js/register.js"
    	type="text/javascript"></script>
    <script src="<%=request.getContextPath()%>/js/sms.js"
    	type="text/javascript"></script>
    <script type="text/javascript">
    	function changeCheckNum() {
    		var checkNumImage_ = document.getElementById("checkNumImage");
    		checkNumImage_.src = "${pageContext.request.contextPath}/image.jsp?timeStamp="+ new Date().getTime();
    	}
    </script>
    <script type="text/javascript">
    	var msg = "${message}";
    	if (msg != "") {
    		alert(msg);
    	}
    </script>
    </head>
    <body>
    	<%@include file="/statics/top.jspf"%>
    	<div class="center_division">
    		<div class="center_body">
    			<div class="center_menu">
    				<font color="#000000">当前位置:</font>
    				<a href="<%=request.getContextPath()%>/statics/reg.jsp"><font color="#000000">用户注册</font></a>
    			</div>
    		</div>
    		<div class="center_body_menu">
    			<s:form action="RegisterAction_register" id="form1" name="form1" method="post" namespace="/">
    				<table id="tb">
    					<tr>
    						<td colspan="3" align="center" bgcolor="#DDDFE1">举报人基本信息</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%">    <img src="images/new_reg_xing.gif"/>用户名:</td>
    						<td align="center" width="40%">
    							<s:textfield name="username" id="username" cssStyle="width:160px;height:24px;" onblur="checkusername()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="usernameTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>username</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>登录密码:</td>
    						<td align="center" width="40%">
    							<s:password name="password" id="password" cssStyle="width:160px;height:24px;" onblur="checkpassword()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="passwordTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>password</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>确认密码:</td>
    						<td align="center" width="40%">
    							<s:password name="passwordRepeat" id="passwordRepeat" cssStyle="width:160px;height:24px;" onblur="checkpasswrodb()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="passwordRepeatTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>passwordRepeat</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>姓        名:</td>
    						<td align="center" width="40%">
    							<s:textfield name="nickname" id="nickname" cssStyle="width:160px;height:24px;" onblur="checknickname()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="nicknameTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>nickname</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%">性        别:</td>
    						<td align="center" width="40%">
    							<s:radio list="#application.dataMap.get('10001')" name="jbSex" cssStyle="height:24px;"/>
    						</td>
    						<td align="left" width="30%"></td>
    					</tr>
    					<tr>
    						<td align="center" width="30%">联系地址:</td>
    						<td align="center" width="40%">
    							<s:textfield name="jbAddress" id="jbAddress" cssStyle="width:160px;height:24px;" />
    						</td>
    						<td align="left" width="30%">
    							<span id="jbAddressTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>jbAddress</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>联系手机:</td>
    						<td align="center" width="40%">
    							<s:textfield id="jbPhone" name="jbPhone" cssStyle="width:160px;height:24px;" onblur="checkjbPhone()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="jbPhoneTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>jbPhone</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center"><img src="images/new_reg_xing.gif"/>短信验证码:</td>
    						<td align="left" colspan="2" style="padding-left: 112px;">
    							<s:textfield id="SmsCheckCode" name="SmsCheckCode" cssStyle="width:80px;height:24px;" maxLength="6" />
    							<span><input type="button" id="btnSendCode" name="btnSendCode" value="免费获取验证码" onclick="sendMessage()" /></span>
    							<span id="SmsCheckCodeTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>SmsCheckCodeTip</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>证件类型:</td>
    						<td align="center" width="40%">
    						<s:select list="#application.dataMap.get('10002')" label=""
    								headerKey="" headerValue="--请选择--" value="1" listValue="value" onchange="enableCredentialsCode(this)"
    								name="jbCredentialsName" id="jbCredentialsName" cssStyle="width:160px;height:24px;"/>
    						</td>
    						<td align="left" width="30%">
    							<s:fielderror cssStyle="color:red;padding-left:10px;">
    								<s:param>jbCredentialsName</s:param>
    							</s:fielderror>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>证件号码:</td>
    						<td align="center" width="40%">
    							<s:textfield name="jbCredentialsCode" id="jbCredentialsCode" cssStyle="width:160px;height:24px;" onblur="checkjbCredentialsCode()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="jbCredentialsCodeTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>jbCredentialsCode</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%">单位名称:</td>
    						<td align="center" width="40%">
    							<s:textfield name="jbCompanyName" id="jbCompanyName" cssStyle="width:160px;height:24px;" />
    						</td>
    						<td align="left" width="30%">
    							<span id="jbCompanyNameTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>jbCompanyName</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%"><img src="images/new_reg_xing.gif"/>所在地区:</td>
    						<td align="center" width="40%">
    						<s:select list="#application.dataMap.get('10003')" label=""
    								headerKey="" headerValue="--请选择--" listKey="key"
    								cssStyle="width:160px;height:24px;" listValue="value" id="jbSourceArea"
    								name="jbSourceArea" onblur="checkjbSourceArea()"/>
    						</td>
    						<td align="left" width="30%">
    							<span id="jbSourceAreaTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>jbSourceArea</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td align="center" width="30%">    <img src="images/new_reg_xing.gif"/>验证码:</td>
    						<td align="center" width="40%">
    							<s:textfield id="checkNum" name="checkNum" cssStyle="width:60px;height:24px;" onblur="checkNumber()" maxLength="4"/>
    							<img id="checkNumImage" src="${pageContext.request.contextPath}/image.jsp">
    							<a onClick="changeCheckNum()" title="点击换一张" style="cursor:hand;"> 换一张</a>
    						</td>
    						<td align="left" width="30%">
    							<span id="checkNumTip">
    								<s:fielderror cssStyle="color:red;padding-left:10px;">
    									<s:param>checkNumTip</s:param>
    								</s:fielderror>
    							</span>
    						</td>
    					</tr>
    					<tr>
    						<td colspan="3" style="vertical-align: top; padding-top: 5px;padding-bottom: 5px;">
    							<input type="submit" value="注册" style="width:50px; height:24px;"/>
    							  
    							<input type="reset" value="重置" style="width:50px; height:24px;"/>
    						</td>
    					</tr>
    				</table>
    			</s:form>
    		</div>
    	</div>
    	<%@include file="/common/buttom.jspf"%>
    </body>
    </html>
    


    三:前台获取短信验证码的js:sms.js

     

     

    var InterValObj; //timer变量,控制时间
    var count = 120; //间隔函数,1秒执行
    var curCount;//当前剩余秒数
    var code = ""; //验证码
    var codeLength = 6;//验证码长度
    
    function sendMessage() {
    	curCount = count;
    	var jbPhone = $("#jbPhone").val();
    	var jbPhoneTip = $("#jbPhoneTip").text();
    	if (jbPhone != "") {
    		if(jbPhoneTip == "√ 该手机号码可以注册,输入正确" || jbPhoneTip == "√ 短信验证码已发到您的手机,请查收"){
    			// 产生验证码
    			for ( var i = 0; i < codeLength; i++) {
    				code += parseInt(Math.random() * 9).toString();
    			}
    			// 设置button效果,开始计时
    			$("#btnSendCode").attr("disabled", "true");
    			$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
    			InterValObj = window.setInterval(SetRemainTime, 1000); // 启动计时器,1秒执行一次
    			// 向后台发送处理数据
    			$.ajax({
    				type: "POST", // 用POST方式传输
    				dataType: "text", // 数据格式:JSON
    				url: "UserAction_sms.action", // 目标地址
    				data: "jbPhone=" + jbPhone +"&code=" + code,
    				error: function (XMLHttpRequest, textStatus, errorThrown) { 
    					
    				},
    				success: function (data){ 
    					data = parseInt(data, 10);
    					if(data == 1){
    						$("#jbPhoneTip").html("<font color='#339933'>√ 短信验证码已发到您的手机,请查收</font>");
    					}else if(data == 0){
    						$("#jbPhoneTip").html("<font color='red'>× 短信验证码发送失败,请重新发送</font>");
    					}else if(data == 2){
    						$("#jbPhoneTip").html("<font color='red'>× 该手机号码今天发送验证码过多</font>");
    					}
    				}
    			});
    		}
    	}else{
    		$("#jbPhoneTip").html("<font color='red'>× 手机号码不能为空</font>");
    	}
    }
    
    //timer处理函数
    function SetRemainTime() {
    	if (curCount == 0) {                
    		window.clearInterval(InterValObj);// 停止计时器
    		$("#btnSendCode").removeAttr("disabled");// 启用按钮
    		$("#btnSendCode").val("重新发送验证码");
    		code = ""; // 清除验证码。如果不清除,过时间后,输入收到的验证码依然有效
    	}else {
    		curCount--;
    		$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
    	}
    }
    
    $(document).ready(function() {
    	$("#SmsCheckCode").blur(function() {
    		var SmsCheckCodeVal = $("#SmsCheckCode").val();
    		// 向后台发送处理数据
    		$.ajax({
    			url : "UserAction_checkCode.action", 
    			data : {SmsCheckCode : SmsCheckCodeVal}, 
    			type : "POST", 
    			dataType : "text", 
    			success : function(data) {
    				data = parseInt(data, 10);
    				if (data == 1) {
    					$("#SmsCheckCodeTip").html("<font color='#339933'>√ 短信验证码正确,请继续</font>");
    				} else {
    					$("#SmsCheckCodeTip").html("<font color='red'>× 短信验证码有误,请核实后重新填写</font>");
    				}
    			}
    		});
    	});
    });

     

    四:验证码用户名和手机号码的js:register.js

     

    //去掉前后空格
    function trim(str) {
    	var strnew = str.replace(/^\s*|\s*$/g, "");
    	return strnew;
    }
    //用户名
    function checkusername() {
    	var username = document.form1.username.value;
    	if (username == "" || !isNaN(username.charAt(0))) {
    		document.getElementById("usernameTip").innerHTML = "<font color='red'>× 首字母不能为数字或者用户名不能为空</font>";
    		return false;
    	} else if (username.length < 6 || username.length > 30) {
    		document.getElementById("usernameTip").innerHTML = "<font color='red'>× 用户名长度为6-30位字符</font>";
    		return false;
    	} else {
    		document.getElementById("usernameTip").innerHTML = "<font color='#339933'>√ 用户名合格</font>";
    		// 向后台发送处理数据
    		$.ajax({
    			url : "UserAction_checkUserName.action",// 目标地址
    			data : {username : username}, // 目标参数
    			type : "POST", // 用POST方式传输
    			dataType : "text", // 数据格式:text
    			success : function(data) {
    				data = parseInt(data, 10);
    				if (data != 0) {
    					$("#usernameTip").html("<font color='red'>× 该用户名已经被注册,请重新输入</font>");
    				} else {
    					$("#usernameTip").html("<font color='#339933'>√ 该用户名可以注册,输入正确</font>");
    				}
    			}
    		});
    		return true;
    	}
    }
    // 登录密码
    function checkpassword() {
    	var password = document.form1.password.value;
    	if (password.length < 6 || password.length > 30) {
    		document.getElementById("passwordTip").innerHTML = "<font color='red'>× 密码长度不能小于6位,大于30位</font>";
    		return false;
    	} else if (!isNaN(password)) {
    		document.getElementById("passwordTip").innerHTML = "<font color='red'>× 密码不能全是数字</font>";
    		return false;
    	} else {
    		document.getElementById("passwordTip").innerHTML = "<font color='#339933'>√ 密码合格</font>";
    		return true;
    	}
    }
    // 确认密码
    function checkpasswrodb() {
    	var password = document.form1.password.value;
    	var passwordRepeat = document.form1.passwordRepeat.value;
    	if (trim(password) != trim(passwordRepeat)) {
    		document.getElementById("passwordRepeatTip").innerHTML = "<font color='red'>× 两次密码输入必须一致</font>";
    		return false;
    	} else {
    		document.getElementById("passwordRepeatTip").innerHTML = "<font color='#339933'>√ 密码输入一致</font>";
    		return true;
    	}
    }
    // 姓名
    function checknickname() {
    	var nickname = document.form1.nickname.value;
    	if (trim(nickname) == "") {
    		document.getElementById("nicknameTip").innerHTML = "<font color='red'>× 姓名不能为空</font>";
    		return false;
    	} else {
    		document.getElementById("nicknameTip").innerHTML = "<font color='#339933'>√ 姓名输入正确</font>";
    		return true;
    	}
    }
    // 联系手机(ajax验证手机号码是否已经存在)
    function checkjbPhone() {
    	var jbPhone = document.form1.jbPhone.value;
    	var re= /(^1[3|5|8][0-9]{9}$)/;
    	if (trim(jbPhone) == "") {
    		document.getElementById("jbPhoneTip").innerHTML = "<font color='red'>× 手机号码不能为空</font>";
    		return false;
    	} else if(trim(jbPhone) != ""){
    		if(!re.test(jbPhone)){
    			document.getElementById("jbPhoneTip").innerHTML = "<font color='red'>× 请输入有效的手机号码</font>";
    			return false;
    		}else{
    			document.getElementById("jbPhoneTip").innerHTML = "<font color='#339933'>√ 手机号码输入正确</font>";
    			// 向后台发送处理数据
    			$.ajax({
    				url : "UserAction_checkPhone.action",// 目标地址
    				data : {jbPhone : jbPhone}, // 目标参数
    				type : "POST", // 用POST方式传输
    				dataType : "text", // 数据格式:text
    				success : function(data) {
    					data = parseInt(data, 10);
    					if (data != 0) {
    						$("#jbPhoneTip").html("<font color='red'>× 该手机号码已经被注册,请重新输入</font>");
    					} else {
    						$("#jbPhoneTip").html("<font color='#339933'>√ 该手机号码可以注册,输入正确</font>");
    					}
    				}
    			});
    			return true;
    		}
    	}
    	
    }
    // 证件号码
    function checkjbCredentialsCode() {
        var jbCredentialsCode = document.form1.jbCredentialsCode.value;
        var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; 
    	if (trim(jbCredentialsCode) == "") {
    		document.getElementById("jbCredentialsCodeTip").innerHTML = "<font color='red'>× 证件号码不能为空</font>";
    		return false;
    	} else if(trim(jbCredentialsCode) != ""){
    		if(!reg.test(jbCredentialsCode)){
    			document.getElementById("jbCredentialsCodeTip").innerHTML = "<font color='red'>× 请输入合法的证件号码</font>";
    			return false;
    		}else{
    			document.getElementById("jbCredentialsCodeTip").innerHTML = "<font color='#339933'>√ 证件号码输入正确</font>";
    			// 向后台发送处理数据
    			$.ajax({
    				url : "UserAction_checkCredentialsCode.action",// 目标地址
    				data : {jbCredentialsCode : jbCredentialsCode}, // 目标参数
    				type : "POST", // 用POST方式传输
    				dataType : "text", // 数据格式:text
    				success : function(data) {
    					data = parseInt(data, 10);
    					if (data != 0) {
    						$("#jbCredentialsCodeTip").html("<font color='red'>× 该证件号码已经被注册,请重新输入</font>");
    					} else {
    						$("#jbCredentialsCodeTip").html("<font color='#339933'>√ 该证件号码可以注册,输入正确</font>");
    					}
    				}
    			});
    			return true;
    		}
    	}
    }
    // 所在地区
    function checkjbSourceArea() {
    	var jbSourceArea = document.form1.jbSourceArea.value;
    	if (trim(jbSourceArea) == "") {
    		document.getElementById("jbSourceAreaTip").innerHTML = "<font color='red'>× 请选择所在地区</font>";
    		return false;
    	} else {
    		document.getElementById("jbSourceAreaTip").innerHTML = "<font color='#339933'>√ 所在地区选择正确</font>";
    		return true;
    	}
    }
    // 验证码
    function checkNumber() {
    	var checkNum = document.form1.checkNum.value;
    	if (trim(checkNum) == "") {
    		document.getElementById("checkNumTip").innerHTML = "<font color='red'>× 验证码不能为空</font>";
    		return false;
    	} else {
    		document.getElementById("checkNumTip").innerHTML = "<font color='#339933'>√ 验证码合格</font>";
    		// 向后台发送处理数据
    		$.ajax({
    			url : "UserAction_checkNum.action",// 目标地址
    			data : {checkNum : checkNum}, // 目标参数
    			type : "POST", // 用POST方式传输
    			dataType : "text", // 数据格式:text
    			success : function(data) {
    				data = parseInt(data, 10);
    				if (data != 0) {
    					$("#checkNumTip").html("<font color='red'>× 验证码错误</font>");
    				} else {
    					$("#checkNumTip").html("<font color='#339933'>√ 验证码正确</font>");
    				}
    			}
    		});
    		return true;
    	}
    }

     

     

    五:后台action的代码:UserAction.java(这里只是调用了我们的第三方给提供的客户端代码的发送短信的方法,如果是调用其他的短信平台,可以换成他们的发送短信的方法,这里只是给大家做个参考)

     

     

    package cn.gov.csrc.base.systemmanager.action;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;
    import org.springframework.context.annotation.Scope;
    import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.stereotype.Controller;
    
    import cn.gov.csrc.base.action.BaseAction;
    import cn.gov.csrc.base.log.service.LogService;
    import cn.gov.csrc.base.report.util.CommonUtil;
    import cn.gov.csrc.base.report.util.Env;
    import cn.gov.csrc.base.systemmanager.model.Count;
    import cn.gov.csrc.base.systemmanager.model.User;
    import cn.gov.csrc.base.systemmanager.service.CountService;
    import cn.gov.csrc.base.systemmanager.service.UserService;
    import cn.gov.csrc.base.util.WebContextUtil;
    
    import com.sms.webservice.client.SmsReturnObj;
    import com.sms.webservice.client.SmsWebClient;
    /**
     * File: UserAction.java 
     * Author: jiangsai 
     * Version: 1.1 
     * Date: 04/17/2013 
     * Modify:
     * Description:用户 
     * Copyright csrc
     */
    @Controller()
    @Scope("prototype")
    @Results({
    		@Result(name = "success", location = "/statics/report.jsp"),
    		@Result(name = "modifyPassword", location = "/statics/modifyPassword.jsp")
    		})
    public class UserAction extends BaseAction<User> {
    	
    	private static final long serialVersionUID = 1214696686677691191L;
    	private static Logger log = Logger.getLogger(UserAction.class);
    	private static final String url = Env.getInstance().getProperty("url");
    	private static final String userName = Env.getInstance().getProperty(
    			"username");
    	private static final String passWord = Env.getInstance().getProperty(
    			"password");
    
    	private Integer id;
    
    	private String username;// 用户名
    
    	private String password;// 密码
    
    	private String passwordRepeat;// 确认密码
    	
    	private String jbPhone;//手机号码
    	
    	private String jbCredentialsCode;//身份证号码
    	
    	private String checkNum;//图片验证码
    
    	private String newPassword;
    
    	private String confirmPassword;
    
    	private Integer[] ownRoleIds;
    
    	private UserService userService;
    	
    	private CountService countService;
    	
    	private LogService logService;
    	
    	private Count count = new Count();
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getUsername() {
    		return username;
    	}
    
    	public void setUsername(String username) {
    		this.username = username;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    	public String getPasswordRepeat() {
    		return passwordRepeat;
    	}
    
    	public void setPasswordRepeat(String passwordRepeat) {
    		this.passwordRepeat = passwordRepeat;
    	}
    	
    	public String getJbPhone() {
    		return jbPhone;
    	}
    
    	public void setJbPhone(String jbPhone) {
    		this.jbPhone = jbPhone;
    	}
    	
    	public String getJbCredentialsCode() {
    		return jbCredentialsCode;
    	}
    
    	public void setJbCredentialsCode(String jbCredentialsCode) {
    		this.jbCredentialsCode = jbCredentialsCode;
    	}
    
    	public String getCheckNum() {
    		return checkNum;
    	}
    
    	public void setCheckNum(String checkNum) {
    		this.checkNum = checkNum;
    	}
    
    	public Integer[] getOwnRoleIds() {
    		return ownRoleIds;
    	}
    
    	public void setOwnRoleIds(Integer[] ownRoleIds) {
    		this.ownRoleIds = ownRoleIds;
    	}
    
    	public String getNewPassword() {
    		return newPassword;
    	}
    
    	public void setNewPassword(String newPassword) {
    		this.newPassword = newPassword;
    	}
    
    	public String getConfirmPassword() {
    		return confirmPassword;
    	}
    
    	public void setConfirmPassword(String confirmPassword) {
    		this.confirmPassword = confirmPassword;
    	}
    
    	@Resource
    	public void setUserService(UserService userService) {
    		this.userService = userService;
    	}
    
    	public UserService getUserService() {
    		return userService;
    	}
    
    	@Resource
    	public void setCountService(CountService countService) {
    		this.countService = countService;
    	}
    
    	public CountService getCountService() {
    		return countService;
    	}
    	
    	public LogService getLogService() {
    		return logService;
    	}
    
    	@Resource
    	public void setLogService(LogService logService) {
    		this.logService = logService;
    	}
    
    	public Count getCount() {
    		return count;
    	}
    
    	public void setCount(Count count) {
    		this.count = count;
    	}
    
    	public void prepareToUpdatePage() {
    		model = userService.getEntity(id);
    	}
    	
    	/**
    	 * 用户登录
    	 * 
    	 * @return success
    	 */
    	@Action(value = "UserAction_login")
    	public String login() {
    		Object u = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    		if (u instanceof User && u != null) {
    			WebContextUtil.getSession().setAttribute("user", u);
    			User user = (User)u;
    			//使用数据库表TBL_BASE_LOG添加用户登录的日志信息
    			logService.saveTblBaseLog(WebContextUtil.getRequest(),"当前操作人【"+user.getNickname()+"】登录系统");
    		} else {
    			// 防止绕过登陆页面直接执行Action
    			return "login";
    		}
    		return SUCCESS;
    	}
    	
    	/**
    	 * 用户密码更新
    	 */
    	@Action(value = "UserAction_updateUser")
    	public String updateUser() {
    		if (!newPassword.equals(confirmPassword)) {
    			this.setMessage("新密码与确认密码不一致!");
    			return "modifyPassword";
    		}
    		User u = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    		MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("md5");
    		String psw = encoder.encodePassword(newPassword, null);
    		userService.modifyPassword(u, psw);
    		this.setMessage("保存成功!");
    		return "modifyPassword";
    	}
    	
    	/**
    	 * 验证用户名是否存在
    	 * 
    	 * @throws Exception
    	 */
    	@Action(value = "UserAction_checkUserName")
    	public void checkUserName(){
    		String result = "0";
    		try {
    			List<User> list = userService.findUserByUserName(username);
    			if(list != null && list.size() > 0){
    				result = "1";
    			}else{
    				result = "0";
    			}
    			HttpServletResponse response = WebContextUtil.getResponse();
    			response.setContentType("application/json;charset=UTF-8");
    			response.setHeader("Cache-Control", "no-cache");
    			PrintWriter out = response.getWriter();
    			out.write(result.toString());
    		} catch (IOException e) {
    			throw new RuntimeException("验证身份证号码出错", e);
    		}
    	}
    
    	/**
    	 * 验证原始密码是否正确
    	 * 
    	 * @throws Exception
    	 */
    	@Action(value = "UserAction_checkPassWord")
    	public void checkPassWord() throws Exception {
    		String result = "0";
    		MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("md5");
    		String pwd = encoder.encodePassword(password, null);
    		List<User> user = userService.findUserByPassWord(pwd);
    		if (user != null && user.size() > 0) {
    			result = "1";
    		}else{
    			result = "0";
    		}
    		HttpServletResponse response = WebContextUtil.getResponse();
    		response.setContentType("application/json;charset=UTF-8");
    		response.setHeader("Cache-Control", "no-cache");
    		PrintWriter out = response.getWriter();
    		out.write(result.toString());
    	}
    	
    	/**
    	 * 验证手机号码是否存在
    	 */
    	@Action(value = "UserAction_checkPhone")
    	public void checkPhone(){
    		String result = "0";
    		try {
    			List<User> list = userService.findUserByPhone(jbPhone);
    			if(list != null && list.size() > 0){
    				result = "1";
    			}else{
    				result = "0";
    			}
    			HttpServletResponse response = WebContextUtil.getResponse();
    			response.setContentType("application/json;charset=UTF-8");
    			response.setHeader("Cache-Control", "no-cache");
    			PrintWriter out = response.getWriter();
    			out.write(result.toString());
    		} catch (IOException e) {
    			throw new RuntimeException("验证手机号码出错", e);
    		}
    	}
    	
    	/**
    	 * 验证身份证号码是否存在
    	 */
    	@Action(value = "UserAction_checkCredentialsCode")
    	public void checkCredentialsCode(){
    		String result = "0";
    		try {
    			List<User> list = userService.findUserByCredentialsCode(jbCredentialsCode);
    			if(list != null && list.size() > 0){
    				result = "1";
    			}else{
    				result = "0";
    			}
    			HttpServletResponse response = WebContextUtil.getResponse();
    			response.setContentType("application/json;charset=UTF-8");
    			response.setHeader("Cache-Control", "no-cache");
    			PrintWriter out = response.getWriter();
    			out.write(result.toString());
    		} catch (IOException e) {
    			throw new RuntimeException("验证身份证号码出错", e);
    		}
    	}
    	
    	/**
    	 * 验证验证码是否正确
    	 */
    	@Action(value = "UserAction_checkNum")
    	public void checkNum(){
    		try {
    			String result = "0";
    			String check_number_key = (String)WebContextUtil.getSession().getAttribute("CHECK_NUMBER_KEY");
    			if(checkNum != check_number_key && !checkNum.equals(check_number_key)){
    				result = "1";
    			}else{
    				result = "0";
    			}
    			HttpServletResponse response = WebContextUtil.getResponse();
    			response.setContentType("application/json;charset=UTF-8");
    			response.setHeader("Cache-Control", "no-cache");
    			PrintWriter out = response.getWriter();
    			out.write(result.toString());
    		} catch (IOException e) {
    			throw new RuntimeException("验证验证码出错", e);
    		}
    	}
    	
    	/**
    	 * 验证短信验证码是否正确
    	 * 
    	 * @throws Exception
    	 */
    	@Action(value = "UserAction_checkCode")
    	public void checkCode() throws Exception{
    		String result = "0";
    		/** 获取手动输入的手机短信验证码 */
    		String SmsCheckCode = WebContextUtil.getRequest().getParameter("SmsCheckCode");
    		/** 获取session中存放的手机短信验证码 */
    		String code = (String) WebContextUtil.getSession().getAttribute("code");
    		try {
    			if(SmsCheckCode != code && !SmsCheckCode.equals(code)){
    				result = "0";
    			}else{
    				result = "1";
    			}
    		} catch (Exception e) {
    			throw new RuntimeException("短信验证失败", e);
    		}
    		HttpServletResponse response = WebContextUtil.getResponse();
    		response.setContentType("application/json;charset=UTF-8");
    		response.setHeader("Cache-Control", "no-cache");
    		PrintWriter out = response.getWriter();
    		out.write(result.toString());
    	}
    	
    	/**
    	 * 验证手机短信是否发送成功
    	 * 
    	 * @throws Exception
    	 */
    	@Action(value = "UserAction_sms")
    	public void sms() throws Exception {
    		String result = "0";
    		/** 手机号码 */
    		String jbPhone = WebContextUtil.getRequest().getParameter("jbPhone");
    		/** 短信验证码 */
    		String code = WebContextUtil.getRequest().getParameter("code");
    		/** 短信验证码存入session(session的默认失效时间30分钟) */
    		WebContextUtil.getSession().setAttribute("code", code);
    		/** 如何初始化失败返回 */
    		if(!initClient()) {
    			return;
    		}
    		/** 单个手机号发送短信的方法的参数准备 */
    		// 手机号码
    		String mobilephone = jbPhone;
    		// 短信内容+随机生成的6位短信验证码
    		String content = "根据中国证监会举报中心委托,特向您发送此条短信。您的注册验证码为:" + code;
    		// 操作用户的ID
    		Integer operId = Integer.parseInt(Env.getInstance().getProperty("operId"));
    		// 定时发送的的发送时间(缺省为空,如果即时发送,填空)
    		String tosend_time = "";
    		// 应用系统的短信ID,用户查询该短信的状态报告(缺省为0,即不需查询短信的状态报告)
    		int sms_id = 0;
    		// 黑名单过滤(0:不需要黑名单过滤,1:需要黑名单过滤,缺省为0)
    		short backlist_filter = 0;
    		// 禁止语过滤(0:不需要禁止语过滤,1:需要禁止语过滤,缺省为0)
    		short fbdword_filter = 0;
    		// 优先级(值越大优先级越高,0:普通,1,:优先,2:最高,缺省为0)
    		short priority = 0;
    		// 短信有效时间(格式为:YYYY-MM-DD HH:mm:ss目前为空)
    		String valid_time = "";
    		/** 发送短信之前先统计一个已经发送的短信条数 */
    		int messageCount = countService.findAllRecord(mobilephone);
    		log.info("已发短信条数为:" +messageCount);
    		if(messageCount < 5){
    			/** 单个手机号发送短信 */
    			if (!sendMessage(mobilephone, content, operId, tosend_time, sms_id,
    					backlist_filter, fbdword_filter, priority, valid_time)) {
    				result = "0";// 失败
    			} else {
    				result = "1";// 成功
    				/** 发送一条短信,记录一条短信记录,为了方便之后的统计短信发送次数 */
    				count.setPhone(mobilephone);// 手机号码
    				count.setCaptcha(code);// 短信验证码
    				count.setSendTime(CommonUtil.getNowDate());// 短信发送时间
    				if(count != null){
    					countService.saveEntity(count);
    					log.info("短信验证码发送记录保存成功!");
    				}
    			}
    		}else{
    			result = "2";//一个手机号码最多发送5条短信验证码
    			log.info("该手机号码今天发送验证码过多");
    		}
    		HttpServletResponse response = WebContextUtil.getResponse();
    		response.setContentType("application/json;charset=UTF-8");
    		response.setHeader("Cache-Control", "no-cache");
    		PrintWriter out = response.getWriter();
    		out.write(result.toString());
    	}
    	
    	/**
    	 * WebService客户端初始化
    	 * 
    	 */
    	public static boolean initClient() {
    		/**
    		 * 判断客户端是否已经初始化
    		 */
    		if (!SmsWebClient.enable()) {
    			int ret = 0;
    			try {
    				ret = SmsWebClient.init(url, userName, passWord);
    				if (ret == -1 || !SmsWebClient.enable()) {
    					log.info("短信平台接口初始化失败!");
    					return false;
    				}
    				log.info("短信平台接口初始化成功!" + ret + "-----");
    			} catch (Exception ex) {
    				ex.printStackTrace();
    				log.info("短信平台接口初始化过程中异常!");
    			}
    		}
    		return true;
    	}
    	
    	/**
    	 * 单个手机号码发送
    	 * 
    	 * @param mobilephone
    	 *            手机号
    	 * @param content
    	 *            短信内容
    	 * @param operId
    	 *            操作用户的ID
    	 * @param tosend_time
    	 *            定时发送的发送时间
    	 * @param sms_id
    	 *            应用系统的短信ID
    	 * @param backlist_filter
    	 *            黑名单过滤
    	 * @param fbdword_filter
    	 *            禁止语过滤
    	 * @param priority
    	 *            优先级
    	 * @param valid_time
    	 *            短信有效时间
    	 */
    	public static boolean sendMessage(java.lang.String mobilephone,
    			java.lang.String content, int operId, java.lang.String tosend_time,
    			int sms_id, short backlist_filter, short fbdword_filter,
    			short priority, java.lang.String valid_time) {
    		// 单个手机号码发送
    		try {
    			SmsReturnObj retObj = SmsWebClient.webSendMessage(mobilephone,
    					content, operId, tosend_time, sms_id, backlist_filter,
    					fbdword_filter, priority, valid_time);
    			if (retObj.getReturnCode() != 1) {
    				log.info("短信发送失败,原因为:" + retObj.getReturnMsg());
    				return false;
    			} else {
    				log.info("短信发送成功!返回结果为:" + retObj.getReturnMsg());
    				return true;
    			}
    		} catch (Exception ex) {
    			ex.printStackTrace();
    			log.info("短信发送过程发生异常!");
    		}
    		return true;
    	}
    	
    	
    }
    

     

     

     

     

     

    六:具体的短信接口demo到这里下,这里你下载了也不能成功的发送短信,因为你必须要短信平台商给你提供:url,userName,passWord,operId,以及短信平台商还要绑定你的外网ip地址,这样才能真正的发送短信。

    Demo下载链接: http://pan.baidu.com/s/1qWt1Qdm

     

    原文:http://www.zuidaima.com/share/1881657001233408.htm

    七:最后,如果有小伙伴在学习的过程中有问题,可以添加楼主微信,楼主会尽量抽时间帮你解决遇到的问题;

    八:如果还是没解决,可以加入QQ交流群讨论解决:

     

    展开全文
  • 考察的点有两个,个是对手机号格式的验证,个是对验证码获取功能的验证 1.冒烟测试(通过测试),测试注册功能能否正常使用 • 输入未被注册过的正确的手机号码,点击获取验证码,查看手机是否收到短信。 • ...

    考察的点有两个,一个是对手机号格式和验证码格式的验证,一个是对验证码获取功能的验证。
    基本原理:验证码1分钟内只能发一次,有效期10分钟。验证码是后台Java代码生成的,然后验证码生成时间和此验证码会保存在数据库的验证码表里面,同时通过短信形式发给手机,用户输入短信验证码并提交后,是Java代码拿到此验证码和库表的验证码进行时间和内容比对的。比对内容一致且时间差少于10分钟,就通过。
    在这里插入图片描述
    1.冒烟测试(通过性测试),测试注册功能能否正常使用
    • 输入未被注册过的正确的手机号码,点击获取验证码,查看手机是否收到短信。
    • 收到短信后输入验证码,点击注册按钮,查看是否注册成功,去数据库检查数据的正确性。
    若测试成功后进行非通过性测试

    2.输入无效等价类手机号
    • 输入10位数字,是否有相应提示
    • 输入12位数字,是否有相应提示
    • 输入11位数字,获取验证码按钮能否点击,是否会发出验证码
    • 输入手机号位中含中文、字母、特殊字符、表情符,是否有相应提示
    • 输入手机号位中含空格,点击获取验证码,是否有相应提示
    • 输入手机号为空,获取验证码能否被点击,是否有相应提示
    • 输入已注册过的手机号,获取验证码以后,是否可以直接登录
    • 输入欠费或停机的手机号,点击获取验证码,能否获取到验证码

    3.获取验证码验证
    前提:输入手机号正确
    • 获取验证码按钮能否被点击
    • 点击获取验证码按钮,发送了验证码以后,获取验证码按钮是否会变为灰色的重新获取并且一分钟内不能再点击
    • 获取验证码按钮变为重新获取以后是否有一分钟倒计时显示,且倒计时显示正确,一分钟以后恢复为获取验证码按钮。
    • 1分钟后再点击发送验证码,得到新验证码后,输入前一个旧验证码应该提示验证码错误;输入当前最新验证码,成功通过。
    • 10分钟后使用,系统应该提示验证码已失效。

    4.输入无效等价类验证码
    前提:输入的手机号正确
    • 输入时间过期的正确的验证码,点击注册按钮,是否提示验证码错误
    • 输入6位错误的验证码,点击注册按钮,是否提示验证码错误
    • 输入5位的验证码,点击注册按钮,是否提示验证码错误
    • 输入7位的验证码,点击注册按钮,是否提示验证码错误
    • 输入验证码中带有中文、字母、特殊字符、表情符,点击注册按钮,是否提示验证码错误
    • 输入验证码中含有空格,点击注册按钮,是否提示验证码错误
    • 输入验证码为空,点击注册按钮,是否提示请输入验证码

    5.网络测试
    1.在无网状态时点击获取验证码按钮,能否获取验证码
    2.在无网状态时注册按钮能否点击并实现跳转
    3.在弱网状态、网络间切换时注册功能能否正常使用
    4.在弱网状态时,检查数据是否会一直处于提交中的状态,有无超时限制。如遇数据交换失败时要给予提示。

    6.UI界面测试
    1.界面风格、文字、图片、颜色的风格是否美观统一。
    2.界面的按钮、控件、菜单的布局是否合理、是否美观,该对齐的要对齐,该居中的要居中
    3.界面是否有错字、别字
    4.文字描述准确,无歧义。

    7.兼容性测试用例:

    对APP的兼容性测试
    1.不同操作系统的手机(Android与iOS)的兼容性
    2.不同品牌手机的兼容性
    3.不同分辨率手机的兼容性
    4.网络的兼容性:2G\3G\4G\WIFI,弱网下、断网时
    5.app跨版本的兼容性。

    对web的兼容性测试
    1.不同硬件平台(PC、手机、平板等)
    2.不同操作系统(linux、windows、macOS、android、ios等)
    3.浏览器兼容性(IE、360、搜狗、chrome、火狐等)

    展开全文
  • 手机验证码

    2016-10-21 20:54:56
    现在网站在建设网站时为了保证用户信息的真实,往往会选择发短信给用户手机验证码信息,只有通过验证的用户才可以注册,这样保证了用户的联系信息资料的100%的准确 。今天笔者就跟大家分享一下如何实现php手机...
  • 处在这个前所未有的信息化时代,网络带给我们极大便利的同时,也让我们的个人信息安全也遭受了严重的威胁。很多人对个人信息的保护意识...如果有一些匿名、临时、一次性的邮箱地址,以及可以免费收发短信验证码的...
  • 0x00:Python脚本游戏关关卡截图:打开关卡的通关地址 截图如下: 0x01:简单分析游戏的已知条件:需要成功登陆,获得游戏的key,点击”获取...一次请求至少要提交如下参数:手机号:13388886666 (固定) 需要手机验证码
  • namespace ConsoleApplication5 { class Program ... 随机生成手机号 ...显示一次删除一次 } } } } }       转载于:https://www.cnblogs.com/dlexia/p/4389062.html
  • 最近几天有人需要帮忙做个关于发送验证码的功能,之前没有做过,于是我鼓捣一阵子,记录一下关于web项目中注册登录常用的手机验证码和邮箱验证码的发送。 作为个演示项目,我没有使用任何框架,用了个简单的...
  • 近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家...
  • 手机发送验证码

    2016-10-10 16:58:47
    现在网站在建设网站时为了保证用户信息的真实,往往会选择发短信给用户手机验证码信息,只有通过验证的用户才可以注册,这样保证了用户的联系信息资料的100%的准确 。今天笔者就跟大家分享一下如何实现php手机...
  • 个短信验证码功能引发的总结思考

    千次阅读 多人点赞 2020-01-08 22:23:53
    文章目录故事短信验证码设计总结1、时间限制2、图形验证码限制 + 时间限制3、手机号+指定时间可以发短信次数限制4、IP及Cookie限制5、短信预警机制后记 故事 昨天看到个地址,新用户免费领取X登读书APP的14天会员...
  • 3.4 账号关联过的手机号会一直收到短信验证码 就像现在很多注重用户安全的公司一样,小蔡的公司也决定对用户的账户增加个强制的功能,就是需要用户绑定手机,这样能让用户第时间得到异常登录的信息,还可以...
  • 手机验证码接收注册新账户

    千次阅读 2017-07-11 16:52:38
    在写注册的时候想使用手机号进行验证,用来保证用户的安全操作,因为以前使用的是邮箱验证,太麻烦了。所以在网上找到了个比较好的第三方提供短信送达服务。 试了下,速度还不错,基本三秒左右就可以收到短信...
  • 0X05 验证码手机号未绑定 0X00 前言  手机验证码在web应用中得到越来越多的应用,通常在用户登陆,用户注册,密码重置等业务模块用手机验证码进行身份验证。针对手机验证码可能存在的问题,收集了一些手机...
  • JSP 注册手机验证码

    千次阅读 2017-09-06 16:01:58
    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家...
  • “ 目前市面上主营短信验证码业务的平台有哪几家、手机验证码平台哪个好,它们提供哪些短信验证码服务,短信发送的速度、送达率和稳定等技术性能如何,短信收费价格多少钱。今天通过评测阿里云、梦网云通讯、容联...
  • 近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文
  • PHP 手机短信发送验证码

    千次阅读 2017-12-27 15:06:01
    本篇设计的知识点有点多,我会分类将,同学们可以选择的看,当然全学会是最好的。 首先我们要清楚以下要点: 1.短信平台 2.编码模式 3.curl方法 4.接口参数 5.返回值(成功/失败) 我们开始吧: 1
  • //启动计时器,1秒执行一次  //向后台发送处理数据 var mobile = document.getElementById("mobile").value; validatemobile(mobile);//调用上边的方法验证手机号码的正确 $.ajax({ type: "POST", //用...
  • 发送手机短信获取验证码功能

    千次阅读 2014-05-05 20:46:12
    这样做的好处很多,例如账号登陆、修改密码、在线支付……等功能模块都可以与手机实时获取验证码短信结合,来确保用户的安全操作。  而这整功能模块的实现,我把它大致分为三个步骤: (1)前端触发获取验证码,...
  • 一次接触jeecg框架后,对这个框架就很喜欢,Jeecg是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design。强大的代码生成器让前端和后台代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,737
精华内容 4,294
关键字:

一次性手机号验证码平台