WeX5中短信验证码功能实例源码
通过代码示例跟我学——如何实现Web应用中的图形验证码功能
目录
1.1 通过代码示例跟我学——如何实现 Web 应用中的图形验证码功能........................2 1.1.1 了解 Web 应用中的验证码的主要作用.................................................................2 1.1.2 Web 应用中的验证码实现原理..............................................................................3 1.1.3 Web 应用中的验证码实现示例——可中、英文切换..........................................4
private Random random ; /** * 下面的 width 和 height 是定义验证码的图片的尺寸 */ private int imageWidth; private int imageHeight; private int verifyCodeStringFontSize; /** * 下面的 verifyCodeType 是定义验证码的文字类型, =1 为英文, =2 为中文 */ private int verifyCodeType=1; /** * 下面的 verifyCode 存储验证码的字符串
2、编程该 JavaBean 的功能实现程序代码
杨教授工作室,版权所有4 ,盗版必究, 4/24 页
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料
3、CreateVerifyCodeImage 程序类的代码示例 package com.px1987.webcrm.util; import java.awt.*; import java.awt.image.BufferedImage; import java.util.*; public class CreateVerifyCodeImage{
短信验证码实现原理
短信验证码实现原理摘要:一、短信验证码的定义与作用二、短信验证码的实现原理1.生成随机码2.发送随机码到用户手机3.用户输入验证码并提交4.验证码核验与匹配5.反馈结果三、短信验证码的应用场景四、短信验证码的优缺点五、未来发展趋势与应用展望正文:一、短信验证码的定义与作用短信验证码,顾名思义,是一种用于验证用户身份的编码。
它通过发送包含特定信息的短信到用户手机,要求用户在规定时间内输入正确的验证码,以证明自己是合法用户。
短信验证码在当今互联网时代被广泛应用于注册、登录、找回密码、支付确认等场景,有效提高了账户安全性。
二、短信验证码的实现原理1.生成随机码:短信验证码系统首先需要生成一个随机码,这个随机码通常由数字和字母组成,具有一定的长度。
2.发送随机码到用户手机:短信服务提供商将生成的随机码发送到用户手机,用户收到短信后,可以在规定时间内输入该验证码。
3.用户输入验证码并提交:在规定时间内,用户需要输入收到的短信验证码,并将其提交到验证服务器。
4.验证码核验与匹配:验证服务器收到用户提交的验证码后,将其与存储在数据库中的原始验证码进行比对。
如果输入的验证码与数据库中的验证码匹配,则验证通过。
5.反馈结果:验证服务器将验证结果反馈给用户,如果验证成功,用户可以继续进行相关操作;如果验证失败,提示用户重新输入或联系客服。
三、短信验证码的应用场景短信验证码广泛应用于各类互联网服务,如注册、登录、找回密码、支付确认、实名认证等场景。
通过使用短信验证码,可以有效降低恶意注册、破解密码等风险,保障用户账户安全。
四、短信验证码的优缺点优点:1.安全性较高:相较于纯数字验证码,短信验证码含有字母和数字,提高了破解难度。
2.便捷性:短信验证码可直接发送到用户手机,用户随时随地可查看和输入。
3.易于实现:短信验证码系统成熟,部署和维护成本较低。
缺点:1.依赖手机信号:用户在部分地区可能因信号不佳而无法收到短信。
2.容易被恶意软件拦截:部分恶意软件会拦截短信,导致用户无法正常接收验证码。
验证码源代码(纯数字、字母数字组合、常用498个汉字)
网站中的验证码源代码(纯数字、字母数字组合、常用498个汉字)新建一个aspx页面,源里面不写任何入代码(假如aspx页面为yanzhengma1.aspx)打开yanzhengma1.aspx.cs页面写入如下代码:using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Drawing;public partial class yanzhengma : System.Web.UI.Page{// private System.IO.MemoryStream ms = new System.IO.MemoryStream();protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){yanzhengma yzm = new yanzhengma();Session["code1"] = yzm.CreateImage(5, ValidType.Numeric);}}/// <summary>/// 验证码的类型/// </summary>public enum ValidType{/// <summary>/// 只有数字/// </summary>Numeric,/// <summary>/// 数字和英文字符/// </summary>NumericAndEnglishChar,/// <summary>/// 中文字符/// </summary>ChineseChar}/// <summary>/// 生成一个随机文字图片,保存在 Session["code1"]/// </summary>/// <param name="count">图片中字的个数</param>/// <returns>生成的文字</returns>public string CreateImage(int count, ValidType type){string ValidCode = GenCode(count, type);switch (type){case ValidType.Numeric:CreateCheckCodeImage(ValidCode, 13.5);break;case ValidType.NumericAndEnglishChar:CreateCheckCodeImage(ValidCode, 14);break;case ValidType.ChineseChar:CreateCheckCodeImage(ValidCode, 22.5);break;default:break;}return ValidCode;}/// <summary>/// 产生随机字符串/// </summary>/// <param name="num">随机出几个字符</param>/// <returns>随机出的字符串</returns>private string GenCode(int num, ValidType type){string str;switch (type){case ValidType.Numeric:str = "0123456789";break;case ValidType.NumericAndEnglishChar:str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";break;case ValidType.ChineseChar://常用498个汉字str = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";break;default:str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";break;}char[] chastr = str.ToCharArray();string code = "";Random rd = new Random();int i;for (i = 0; i < num; i++){code += str.Substring(rd.Next(0, str.Length), 1);}return code;}/// <summary>/// 生成图片(增加背景噪音线、前景噪音点)/// </summary>/// <param name="checkCode">随机出字符串</param>private void CreateCheckCodeImage(string checkCode, double codeWidth){if (checkCode.Trim() == "" || checkCode == null)return;System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)(checkCode.Length * codeWidth), 22);//string path = Server.MapPath("~/images/1.jpg");//System.Drawing.Image image = System.Drawing.Image.FromFile(path);//System.Drawing.Bitmap image = new System.Drawing.Bitmap(path);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景色g.Clear(Color.White);// 画图片的背景噪音线int i;for (i = 0; i < 25; i++){int x1 = random.Next(image.Width);int x2 = random.Next(image.Width);int y1 = random.Next(image.Height);int y2 = random.Next(image.Height);g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);}Font font = new System.Drawing.Font("Verdana", 12, (System.Drawing.FontStyle.Bold));System.Drawing.Drawing2D.LinearGradientBrush brush = newSystem.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);//System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush( Color.Blue);g.DrawString(checkCode, font, brush, 2, 2, new System.Drawing.StringFormat());//画图片的前景噪音点g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);System.IO.MemoryStream ms = new System.IO.MemoryStream();image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);HttpContext.Current.Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);//清除该页输出缓存,设置该页无缓存//Response.Buffer = true;//Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);//Response.Expires = 0;//Response.CacheControl = "no-cache";//Response.AppendHeader("Pragma", "No-Cache");HttpContext.Current.Response.ClearContent();HttpContext.Current.Response.ContentType = "image/JPEG";HttpContext.Current.Response.BinaryWrite(ms.ToArray());g.Dispose();image.Dispose();}catch{g.Dispose();image.Dispose();}}}在要插入验证码的地方插入如下代码:(也可以用 <img>控件,只要是图片控件都行)<asp:ImageButton ID="ImageButton7" runat="server" Height="40px" Width="150px" onclick="ImageButton7_Click1" /><span>点击图片更换图片</span><br /><asp:Label ID="Label1" runat="server" ForeColor="Red" Text = " "> </asp:Label>比如这是登录页面,当页面加载的时候就需要用到验证码,故在代码的page_load() 中插入代码:this.ImageButton7.ImageUrl = "yanzhengma1.aspx"; 这样当页面加载的时候就会出现验证码了。
易语言短信验证码通知代码示例
.版本2.支持库iconv.支持库EXMLParser.程序集窗口程序集_启动窗口.子程序__启动窗口_创建完毕.子程序账户信息判断, 逻辑型, 公开.如果真(接口名.内容="")信息框("请输入用户名", 0, )返回(假).如果真结束.如果真(接口密.内容="")信息框("请输入密码", 0, )返回(假).如果真结束返回(真).子程序发送数据判断, 逻辑型, 公开.如果真(手机号.内容="")信息框("请输入手机号码", 0, )返回(假).如果真结束.如果真(短信内容.内容="")信息框("请输入要发送的内容", 0, )返回(假).如果真结束返回(真).子程序_按钮1_被单击.局部变量节点名数组, 文本型, , "0".局部变量子节点数, 整数型.局部变量i, 整数型.如果真(取反(账户信息判断()))返回().如果真结束.如果真(取反(发送数据判断()))返回().如果真结束状态标签.标题=短信发送(接口名.内容, 接口密.内容, 手机号.内容, 短信内容.内容) xml文件名=取当前目录() +"\data\submit.xml"状态标签.标题=到文本(编码转换(到字节集(状态标签.标题), #编码_UTF_8, #编码_GBK, ))写到文件(xml文件名, 到字节集(状态标签.标题))xml.导入(xml文件名)xml.取根节点名(根节点)xml.取子节点数(根节点, 子节点数).如果真(子节点数>0)xml.取子节点名(根节点, 节点名数组)输出调试文本(节点名数组[1])输出调试文本(节点名数组[2])输出调试文本(节点名数组[3])输出调试文本(xml.取节点值文本(根节点+"/code", ))输出调试文本(xml.取节点值文本(根节点+"/msg", ))输出调试文本(xml.取节点值文本(根节点+"/smsid", ))状态标签.标题="状态码:" +xml.取节点值文本(根节点+"/code", ) +#换行符+"描述:" +xml.取节点值文本(根节点+"/msg", ) +#换行符+"流水号:" +xml.取节点值文本(根节点+"/smsid", ).如果真结束xml.释放()返回()返回().子程序_按钮2_被单击.局部变量节点名数组, 文本型, , "0".局部变量子节点数, 整数型.局部变量i, 整数型.如果真(取反(账户信息判断()))返回().如果真结束状态标签.标题=剩余条数(接口名.内容, 接口密.内容)xml文件名=取当前目录() +"\data\getnum.xml"状态标签.标题=到文本(编码转换(到字节集(状态标签.标题), #编码_UTF_8, #编码_GBK, ))写到文件(xml文件名, 到字节集(状态标签.标题))xml.导入(xml文件名)xml.取根节点名(根节点)xml.取子节点数(根节点, 子节点数).如果真(子节点数>0)xml.取子节点名(根节点, 节点名数组)输出调试文本(节点名数组[1])输出调试文本(节点名数组[2])输出调试文本(节点名数组[3])输出调试文本(xml.取节点值文本(根节点+"/code", ))输出调试文本(xml.取节点值文本(根节点+"/msg", ))输出调试文本(xml.取节点值文本(根节点+"/num", ))状态标签.标题="状态码:" +xml.取节点值文本(根节点+"/code", ) +#换行符+"描述:" +xml.取节点值文本(根节点+"/msg", ) +#换行符+"条数:"+xml.取节点值文本(根节点+"/num", ).如果真结束xml.释放()返回().子程序GBK编码转换, 文本型, 公开, 将一个GBK编码的文本转换为URL编码,返回一个URL编码.参数文本, 文本型, , 需要转换为URL编码的GBK编码的文本.局部变量GBK文本, 字节集.局部变量URL码, 文本型.局部变量n, 整数型GBK文本=到字节集(文本).计次循环首(取字节集长度(GBK文本), n)URL码=URL码+"%" +取十六进制文本(GBK文本[n]).计次循环尾()返回(URL码).子程序UTF8编码转换, 文本型, 公开, 将一个UTF8编码的文本转换为URL编码,返回一个URL编码.参数文本, 文本型, , 需要转换为URL编码的UTF8编码的文本.局部变量URL码, 文本型.局部变量n, 整数型.局部变量UTF8文本, 字节集UTF8文本=编码转换(到字节集(文本), #编码_GBK, #编码_UTF_8, ).计次循环首(取字节集长度(UTF8文本), n)URL码=URL码+"%" +取十六进制文本(UTF8文本[n]).计次循环尾()返回(URL码).子程序_分组框4_鼠标左键被按下, 逻辑型.参数横向位置, 整数型.参数纵向位置, 整数型.参数功能键状态, 整数型互亿无线短信平台公司介绍:互亿无线成立于2004年,公司主营业务为云通信及虚拟商品分发服务;自成立以来,累计服务客户超过10万家。
微信小程序中短信验证码登录全流程及代码
微信⼩程序中短信验证码登录全流程及代码短信验证码实现流程1、构造⼿机验证码,⽣成⼀个6位的随机数字串;2、使⽤接⼝向短信平台发送⼿机号和验证码,然后短信平台再把验证码发送到制定⼿机号上3、将⼿机号验证码、操作时间存⼊Session,redis中,作为后⾯验证使⽤;4、接收⽤户填写的验证码、⼿机号及其他注册数据;5、对⽐提交的验证码与Session,redis中的验证码是否⼀致,同时判断提交动作是否在有效期内;6、验证码正确且在有效期内,请求通过,处理相应的业务。
package com.foen.utils;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import monRequest;import monResponse;import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.exceptions.ClientException;import com.aliyuncs.exceptions.ServerException;import com.aliyuncs.http.HttpRequest;import com.aliyuncs.http.MethodType;import com.aliyuncs.profile.DefaultProfile;import com.foen.car.dto.BaseResultDto;import com.foen.car.service.RedisService;import ng.StringUtils;import org.apache.shiro.SecurityUtils;import org.apache.shiro.session.Session;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;/*** ⼿机短信通信类* @auther: 作者 gzh* @description: 类说明* @Date: created in 9:45 2020/5/27*/public class MoblieMessageUtil {private static final Logger logger = LoggerFactory.getLogger(MoblieMessageUtil.class);// 产品名称:云通信短信API产品,开发者⽆需替换private static final String product = "Dysmsapi";private static final String domain = "";// 此处需要替换成开发者⾃⼰的AK(在阿⾥云访问控制台寻找)private static String accessKeyId = "---";private static String accessKeySecret = "---";private static String signName = "--";private static String identifyingTempleteCode = "{\"code\":\"1111\"}";private static String registTempleteCode = "---";public static BaseResultDto sendSmsCode(String tel, String code, HttpServletRequest httpServletRequest) {BaseResultDto baseResultDto = Utils.baseDefaultResultMessageError();DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");request.putQueryParameter("RegionId", "cn-hangzhou");request.putQueryParameter("PhoneNumbers", tel);request.putQueryParameter("SignName", signName);request.putQueryParameter("TemplateCode", registTempleteCode);request.putQueryParameter("TemplateParam","{\"code\":"+code+"}" );request.putQueryParameter("SmsUpExtendCode", code);try {CommonResponse response = client.getCommonResponse(request);("==>"+response.getData());if(response.getData().indexOf("OK")!=-1){baseResultDto=Utils.renderBaseResultDtoSuccess("短信发送成功");}else{baseResultDto=Utils.renderBaseResultDtoError(response.getData());}} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return baseResultDto;}/*** 保存数据到session* @param request* @param code* @param phone*/private static void setSendSmsCode(HttpServletRequest request,String code,String phone){ Session session = SecurityUtils.getSubject().getSession();session.setAttribute(Constants.CRM_STR+phone, code);try {final Timer timer=new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {String yxcode1 = (String) session.getAttribute(Constants.CRM_STR+phone);if(StringUtils.isNotEmpty(yxcode1)){session.removeAttribute(Constants.CRM_STR+phone);}timer.cancel();}},Constants.SIGN_EXPIRED_TIME);} catch (Exception e) {e.printStackTrace();}}public static void setRegistData(RedisService service, String phone, String code){service.setValue(Constants.CRM_STR+phone,code);service.setValue(Constants.CRM_TIME+phone,DateUtils.dateToStringFromat());try {//TimerTask实现5分钟后从session.resdis中删除checkCodefinal Timer timer=new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {String phone_ = service.getValue(Constants.CRM_STR+phone);String vcode_ = service.getValue(Constants.CRM_TIME+phone);if(StringUtils.isNotEmpty(phone_)){service.delete(Constants.CRM_STR+phone);}if(StringUtils.isNotEmpty(vcode_)){service.delete(Constants.CRM_TIME+phone);}timer.cancel();}},Constants.SIGN_EXPIRED_TIME);} catch (Exception e) {e.printStackTrace();}}}短信通信类短信验证码实现流程1、构造⼿机验证码,⽣成⼀个6位的随机数字串;2、使⽤接⼝向短信平台发送⼿机号和验证码,然后短信平台再把验证码发送到制定⼿机号上3、将⼿机号验证码、操作时间存⼊Session,redis中,作为后⾯验证使⽤;4、接收⽤户填写的验证码、⼿机号及其他注册数据;5、对⽐提交的验证码与Session,redis中的验证码是否⼀致,同时判断提交动作是否在有效期内;6、验证码正确且在有效期内,请求通过,处理相应的业务。
移动应用开发短信验证码集成教程
移动应用开发短信验证码集成教程随着移动互联网的迅猛发展,手机应用程序在我们的生活中占据越来越重要的位置。
而在应用程序中,短信验证码成为了一种常见的身份验证方式。
本文将介绍如何在移动应用开发中集成短信验证码功能,以确保用户的安全和便捷。
第一步,准备工作。
在开始之前,我们需要先获取一个可靠的短信验证码服务提供商。
虽然市场上有很多选择,但我们需要选择一个安全可靠、服务稳定、技术支持好的提供商。
同时,我们还需要申请一个开发者账号,获取相应的API密钥。
第二步,集成SDK。
一般来说,短信验证码服务提供商会提供相应的SDK用于移动应用开发的集成。
我们需要将SDK导入到我们的项目中,并按照提供商的文档进行配置。
这通常包括添加必要的依赖库、配置权限以及初始化 SDK。
第三步,发送短信验证码。
一旦完成了SDK的集成和配置,我们就可以开始发送短信验证码了。
首先,用户需要在应用中输入他们的手机号码。
然后,我们调用相应的API接口将手机号码发送给服务提供商。
服务提供商会通过短信将验证码发送到用户的手机上。
我们可以在发送之前对手机号进行验证,以确保格式正确以及防止恶意操作。
第四步,验证短信验证码。
当用户接收到短信验证码后,他们需要在应用中输入该验证码进行验证。
我们可以通过调用服务提供商的API接口将用户输入的验证码发送给服务提供商进行验证。
服务提供商会验证该验证码是否有效,并将结果返回给我们的应用。
我们可以根据验证结果来决定用户是否成功登录。
在以上的基础上,我们还可以对短信验证码功能进行进一步的优化和扩展。
例如,我们可以对验证码的有效期进行设置,防止过期验证码的使用。
我们还可以增加图形验证码等附加验证方式,提高验证的安全性。
当然,这些优化和扩展需要根据具体的需求和服务提供商的支持来进行。
总结一下,移动应用开发短信验证码集成是一项重要且必要的工作。
通过集成短信验证码功能,我们可以增加应用的安全性,避免恶意操作和数据泄漏。
同时,短信验证码也为用户提供了方便快捷的登录方式,提高了用户体验。
短信验证码实现原理
短信验证码实现原理1. 短信验证码实现的原理是通过手机短信服务将验证码发送到用户的手机上。
2. 发送短信验证码的过程分为前端请求验证码和后端发送验证码两个步骤。
3. 前端请求验证码时,用户需要提供手机号码,并点击发送验证码的按钮。
4. 后端接收到前端请求之后,会生成一个随机的验证码,并将其保存在内存或数据库中,同时也会记录该手机号码和验证码的对应关系。
5. 后端将生成的验证码通过短信接口发送到用户的手机上,手机接收到短信后会显示其中的验证码内容。
6. 用户在手机上看到验证码后,将其输入到前端页面中,进行验证。
7. 前端将用户输入的验证码通过网络请求发送给后端验证。
8. 后端接收到用户输入的验证码后,会与之前保存的手机号码和验证码对应关系进行比对,判断是否匹配。
9. 如果匹配成功,则认证通过,用户可以继续下一步操作;如果匹配失败,则认证不通过,可能是用户输入错误或者验证码过期。
10. 在整个过程中,为了增加验证码的安全性,通常还会对发送验证码的频率进行限制,以防止恶意发送短信验证码。
11. 后端还可以对验证码进行有效期限制,一般情况下验证码的有效期为几分钟,过期后将无法再进行验证。
12. 为了保护用户的隐私,验证码在传输过程中通常会进行加密处理,避免被恶意截获。
13. 短信验证码实现的原理基于手机短信服务的机制,利用了短信的通信渠道将验证码发送到用户的手机上。
14. 短信验证码实现原理中的核心步骤是生成随机的验证码和通过短信接口发送验证码至用户手机。
15. 验证码会在一定时间后失效,一方面是为了防止验证码被滥用,另一方面是为了安全性考虑,避免长期有效导致风险。
16. 短信验证码实现原理既保证了安全性,又简化了用户的验证流程,提升了用户体验。
17. 短信验证码实现原理可以应用在各种需要用户身份验证的场景,例如登录、注册、密码重置等。
18. 在发送短信验证码时,还需注意短信平台的选择和接口的调用,以保证短信的发送成功率和稳定性。
生成验证码的代码
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
if (number % 2 == 0)
//生成'0'-'9'字符
code = (char)('0' + (char)(number % 10));
else
//生成'A'-'Z'字符
if( this.ClientScript.IsStartupScriptRegistered ("checkcode")==false)
{
this.ClientScript.RegisterStartupScript(this.GetType (),"checkcode","<script>alert('验证码错误!');</script>");
public void ProcessRequest(HttpContext context)
{
string g = GenerateCheckCode();
CreateCheckCodeImage(g);
}
public bool IsReusable
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
随机验证码的代码实现方法
随机验证码的代码实现方法下面是一个使用 Python 生成随机验证码的示例代码:```pythonimport randomimport stringdef generate_random_code(length=6):# 定义所有可能的字符all_characters = string.ascii_letters + string.digits# 生成指定长度的随机验证码random_code = ''.join(random.choice(all_characters) for _ in range(length))return random_code# 生成一个随机验证码random_code = generate_random_code()print("随机验证码:", random_code)```在这个示例中,我们首先定义了一个`generate_random_code`函数,它接受一个可选的参数`length`,用于指定生成的随机验证码的长度。
默认情况下,生成的随机验证码的长度为 6 个字符。
在函数内部,我们使用`string.ascii_letters`表示所有的字母(包括大小写),`string.digits`表示所有的数字。
然后,我们使用`random.choice()`方法从所有可能的字符中随机选择字符,并使用循环生成指定长度的随机验证码。
最后,我们调用`generate_random_code`函数生成一个随机验证码,并将其打印输出。
你可以根据需要调整`length`参数的值来生成不同长度的随机验证码。
希望这个示例对你有所帮助!如果还有其他问题,请随时提问。
手机短信验证码方案
手机短信验证码方案第1篇手机短信验证码方案一、背景随着移动互联网的高速发展,手机短信验证码已成为各类应用和服务中不可或缺的一环。
为保障用户账户安全,提高用户体验,本方案旨在制定一套合法合规的手机短信验证码发送机制。
二、目标1. 确保用户在注册、登录、找回密码等场景中,能够便捷地接收短信验证码。
2. 保障用户信息安全和隐私,防止短信验证码被恶意使用。
3. 符合国家相关法律法规,遵守运营商规定,确保短信发送的合法合规性。
三、方案内容1. 短信验证码发送策略(1)验证码生成:采用随机数生成算法,生成6位数字验证码。
(2)发送频率限制:同一手机号码,每分钟最多发送1次验证码,每日最多发送5次验证码。
(3)验证码有效期:验证码有效期为5分钟,过期自动失效。
(4)发送时间限制:避免在用户休息时间发送,可在白天工作时间发送。
2. 用户操作流程(1)注册/登录:用户输入手机号码,点击获取验证码,系统自动发送验证码至用户手机。
(2)找回密码:用户输入手机号码,点击获取验证码,系统自动发送验证码至用户手机。
(3)修改绑定手机:用户输入新手机号码,点击获取验证码,系统自动发送验证码至新手机号码。
(4)其他需要验证的场景:根据实际业务需求,设计相应的验证流程。
3. 验证码校验机制(1)用户输入验证码后,系统对验证码进行校验,判断是否正确。
(2)验证码正确,允许用户进行后续操作;验证码错误,提示用户重新输入。
(3)验证码过期或已使用,提示用户重新获取。
4. 安全防护措施(1)短信验证码传输加密:采用SSL加密技术,保障短信验证码在传输过程中的安全。
(2)短信验证码存储加密:对存储在数据库中的短信验证码进行加密处理。
(3)防止恶意攻击:对频繁请求验证码、异常IP地址等行为进行监控,防止恶意攻击。
(4)用户隐私保护:严格遵守国家法律法规,保护用户个人信息,不泄露用户手机号码等隐私。
5. 合法合规性(1)遵守《中华人民共和国网络安全法》等相关法律法规,确保短信验证码方案的合法合规性。
优秀的短信验证码模板
优秀的短信验证码模板短信验证码是当前在各种应用和网站中常见的一种安全验证方式,它通过发送一条包含随机数字或字符的短信到用户注册手机号上,用户在登录或进行重要操作时需要输入正确的验证码才能完成验证。
一个高效、安全、友好的短信验证码模板对于用户体验和账号安全至关重要。
以下是一个优秀的短信验证码模板的示例:【应用名称】验证码:****(4位数字),请尽快完成验证。
这个模板符合短信验证码模板的几个重要特点:1. 简洁明了:短信验证码模板不需要过多的信息,只需要包含验证码本身和一些简短的提示。
这个模板在"验证码"后直接给出了验证码的位数(4位)和类型(数字)并使用"****"来表示验证码的具体内容。
这样的提示能够让用户一目了然,提高验证码的可读性。
2. 温馨提示:在"请尽快完成验证"的提示下,这个模板给用户传递了一种紧迫感,强调了验证码的重要性和使用期限。
这样的提示能够提醒用户及时处理验证码,避免验证码因为过期而失效。
3. 不含个人信息:这个模板并没有包含用户的个人信息,如用户名、手机号码等,这样能够防止敏感信息的泄露,保护用户的隐私。
此外,一个优秀的短信验证码模板还应该具备以下几个要素:1. 安全性:验证码应该是随机生成的,并且保证一定的复杂度,不易被猜测或者恶意生成。
这样能够有效地防止验证码被破解或者伪造。
2. 有效期限:验证码应该有一个适当的有效期限,用户在一定时间内使用验证码,否则验证码失效。
这样能够防止验证码被滥用。
3. 可重复性:用户在一段时间内可以重新请求发送验证码,以便在一次验证失败后重新获取验证码。
这样能够提高用户体验,避免用户因为一次验证失败而无法进行操作。
4. 发送限制:应用应该对验证码的发送进行限制,避免用户受到过多的验证码短信骚扰,也能够防止验证码被频繁请求发送。
总之,一个优秀的短信验证码模板应该是简洁、明了、安全、友好和有效的。
微信小程序云开发-登录功能(手机号验证码登录)
微信⼩程序云开发-登录功能(⼿机号验证码登录)⼀、需求分析使⽤⼿机号码和随机短信验证码登录。
⼆、创建云函数创建云函数,命名为sendSMS,实现将获取到的随机验证码发送到⽤户⼿机短信上。
1// 云函数⼊⼝⽂件2 const cloud = require('wx-server-sdk')34//cloud.init()5 cloud.init({6 env: cloud.DYNAMIC_CURRENT_ENV7 })8//云函数的功能:发送短信验证码910// 云函数⼊⼝函数11 exports.main = async (event, context) => {12 const result = await cloud.openid.cloudbase.sendSms({13 env:cloud.DYNAMIC_CURRENT_ENV,14 phone_number_list:[15 "+86"+event.phoneNumber16 ],17 content:"【公司名称】验证码为:"+event.RandomPhoneCode,18 })1920 }三、代码实现1、loadByPhone.wxml1<!-- ⼿机号码 -->2<text class="text1">⼿机号码</text>3<view class="phoneNum">4<input type="text" placeholder="请输⼊⼿机号码" bindinput="getPhoneNumber"></input>5</view>6<!-- 验证码 -->7<text class="text1">验证码</text>8<view class="phoneCode">9<input type="text" placeholder="请输⼊验证码" bindinput="getPhoneCode"></input>10<button type="primary" size="mini" bindtap="sendPhoneCode">发送验证码</button>11</view>12<!-- 登录 -->13<view class="loadButton">14<button type="primary" bindtap="loadByPhone">登录</button>15</view>2、loadByPhone.wxss1.text1{2 margin:20rpx;3 }4.phoneNum input{5 margin: 20rpx;6 padding-left: 10rpx;7 height: 80rpx;8 border: 1rpx solid #c3c3c3;9 }10.phoneCode{11 display: flex;12 align-items: center;13 }14.phoneCode input{15 width: 60%;16 margin: 20rpx;17 border: 1rpx solid #c3c3c3;18 padding-left: 10rpx;19 height: 80rpx;20 }21.phoneCode button{22 height: 80rpx;23 vertical-align: middle;24 }2526.loadButton button{27 margin-top: 50rpx;28 width: 94% !important;29 }3、loadByPhone.js知识点归纳整理:点击发送验证码按钮时候的校验功能点击【登录】按钮时候的校验功能⾃定义函数 generateMixed(n),获取随机验证码调⽤云函数sendSMS,实现将获取的短信验证码发送到⽤户真实⼿机短信中1//⾃定义全局变量,存储输⼊的⼿机号码和验证码2 let phoneNumber = ''3 let phoneCode = ''4//⾃定义全局变量,存储获取到的随机验证码5 let RandomPhoneCode = ''6 Page({78 data: {910 },1112//获取⽤户输⼊的⼿机号码13 getPhoneNumber(e){14 console.log("输⼊的⼿机号码",e);15 phoneNumber = e.detail.value16 },17//获取⽤户输⼊的验证码18 getPhoneCode(e){19 console.log("输⼊的短信验证码",e);20 phoneCode = e.detail.value21 },22//发送验证码23 sendPhoneCode(){24 console.log("点击了发送短信验证码的按钮");25//调⽤⽣成验证码的函数generateMixed(n)获取4位验证码,并将⽣成的4位验证码赋给⾃定义变量RandomPhoneCode26 RandomPhoneCode = this.generateMixed(4)27 console.log("⽣成的随机验证码",RandomPhoneCode);28//如果⼿机号码不是11位,给予提⽰,并终⽌代码执⾏29if(phoneNumber.length!=11){30 wx.showToast({31 title: '请输⼊11位⼿机号码',32 icon:"none"33 })34return35 }36//调⽤云函数,实现发送短信验证码到真实⼿机号码上37 wx.cloud.callFunction({38 name:"sendSMS",39 data:{40 phoneNumber:phoneNumber,41 RandomPhoneCode:RandomPhoneCode42 }43 }).then(res=>{44 console.log("验证码发送到⼿机短信成功",res);45 }).catch(err=>{46 console.log("验证码发送到⼿机短信失败",err);47 })48 },4950//实现验证登录功能51 loadByPhone(){52//如果⼿机号码不是11位,给予提⽰,并终⽌代码执⾏53if(phoneNumber.length!=11){54 wx.showToast({55 title: '请输⼊11位⼿机号码',56 icon:"none"57 })58return59 }60//如果输⼊的验证码为空或者输⼊的验证码不等于获取到的随机验证码,给与提⽰,并终⽌代码执⾏61if(phoneCode.length==0){62 console.log("输⼊的验证码",phoneCode);63 wx.showToast({64 title: '请输⼊短信验证码',65 icon:"none"66 })67return68 }69//校验⽤户输⼊的验证码是否等于获取的随机验证码70if(phoneCode!=null&phoneCode==RandomPhoneCode){71 wx.showToast({72 title: '登录成功',73 icon:"success",74 duration:2000,75 success:function(){76 setTimeout(function(){77 wx.switchTab({78 url: '/pages/index/index',79 })80 },2000)81 }82 })83 }else{84 wx.showToast({85 title: '验证码错误',86 icon:"none"87 })88 }89 },9091//⾃定义函数。
短信验证码实现流程_微信公众平台开发实例教程_[共9页]
type: "POST", url: "send_mess.php", data: datestr, cache: false, success: function(result) {
if(result == "11") {
$("#hint").html("手机号未填写"); return false; }else if(result == "22"){ alert("发送成功,请注意查收"); return false; } } }) } </script>
微信小程序发送短信验证码完整实例
微信⼩程序发送短信验证码完整实例微信⼩程序注册完整实例,发送短信验证码,带60秒倒计时功能,⽆需服务器端。
效果图:代码:index.wxml<!--index.wxml--><view class="container"><view class='row'><input placeholder='请输⼊姓名' bindinput='bindNameInput'/></view><view class='row'><input placeholder='请输⼊⼿机号' bindinput='bindPhoneInput'/></view><view class='row'><input placeholder='请输验证码' bindinput='bindCodeInput' style='width:70%;'/><button class='codeBtn' bindtap='getCode' hidden='{{hidden}}' disabled='{{btnDisabled}}'>{{btnValue}}</button></view><view><button class='save' bindtap='save' >保存</button></view></view>index.js//index.jsvar zhenzisms = require('../../utils/zhenzisms.js');//获取应⽤实例const app = getApp();Page({data: {hidden: true,btnValue:'',btnDisabled:false,name: '',phone: '',code: '',second: 60},onLoad: function () {},//姓名输⼊bindNameInput(e) {this.setData({name: e.detail.value})},//⼿机号输⼊bindPhoneInput(e) {console.log(e.detail.value);var val = e.detail.value;this.setData({phone: val})if(val != ''){this.setData({hidden: false,btnValue: '获取验证码'})}else{this.setData({hidden: true})}},//验证码输⼊bindCodeInput(e) {this.setData({code: e.detail.value})},//获取短信验证码getCode(e) {console.log('获取验证码');var that = this;zhenzisms.client.init('https://sms_', 'appId', 'appSecret'); zhenzisms.client.send(function (res) {if(res.data.code == 0){that.timer();return ;}wx.showToast({title: res.data.data,icon: 'none',duration: 2000})}, '158********', '验证码为:3322');},timer: function () {let promise = new Promise((resolve, reject) => {let setTimer = setInterval(() => {var second = this.data.second - 1;this.setData({second: second,btnValue: second+'秒',btnDisabled: true})if (this.data.second <= 0) {this.setData({second: 60,btnValue: '获取验证码',btnDisabled: false})resolve(setTimer)}}, 1000)})promise.then((setTimer) => {clearInterval(setTimer)})},//保存save(e) {console.log('姓名: ' + );console.log('⼿机号: ' + this.data.phone);console.log('验证码: ' + this.data.code);//省略提交过程}})index.wxss/**index.wxss**/page{height: 100%;width: 100%;background: linear-gradient(#5681d7, #486ec3);display: flex;flex-direction: column;}.container{display: flex;flex-direction: column;justify-content: space-around;width: 90%;margin: 50rpx auto;}.row{position: relative;height: 80rpx;width: 100%;border-radius: 10rpx;background: #fff;margin-bottom: 20rpx;padding-left: 20rpx;box-sizing: border-box;}.row input{width: 100%;height:100%;}.codeBtn{position: absolute;right: 0;top: 0;color: #bbb;width: 30%;font-size: 26rpx;height: 80rpx;line-height: 80rpx;}.subBtn{width: 200rpx;height: 80rpx;background: #fff;color: #000;border-radius: 50rpx;line-height: 80rpx;}完整下载:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
微信小程序手机号码验证功能的实例代码
微信⼩程序⼿机号码验证功能的实例代码wxml<form bindsubmit='formSubmit'><view class='all'><text>⼿机号:</text><input name="phone" placeholder='请输⼊⼿机号' type='number' style='color:#333' placeholder-style="color:#666" maxlength="11" bindinput='blurPhone'></input> </view><button formType="submit">保存</button></form>wxss.all {border-top: 1rpx solid #efefef;border-bottom: 1rpx solid #efefef;height: 98rpx;font-size: 28rpx;display: flex;align-items: center;}button {width: 480rpx;height: 80rpx;background-color: #7ecffd;font-size: 30rpx;color: #fff;border-radius: 8px;margin: 50rpx auto;}jsPage({/*** 页⾯的初始数据*/data: {ajxtrue: false,},// ⼿机号验证blurPhone: function(e) {var phone = e.detail.value;let that = thisif (!(/^1[34578]\d{9}$/.test(phone))) {this.setData({ajxtrue: false})if (phone.length >= 11) {wx.showToast({title: '⼿机号有误',icon: 'success',duration: 2000})}} else {this.setData({ajxtrue: true})console.log('验证成功', that.data.ajxtrue)}},// 表单提交formSubmit(e) {let that = thislet val = e.detail.valuelet ajxtrue = this.data.ajxtrueif (ajxtrue == true) {//表单提交进⾏} else {wx.showToast({title: '⼿机号有误',icon: 'success',duration: 2000})}},/*** ⽣命周期函数--监听页⾯加载*/onLoad: function(options) {},/*** ⽣命周期函数--监听页⾯初次渲染完成*/onReady: function() {},/*** ⽣命周期函数--监听页⾯显⽰*/onShow: function() {},/*** ⽣命周期函数--监听页⾯隐藏*/onHide: function() {},/*** ⽣命周期函数--监听页⾯卸载*/onUnload: function() {},/*** 页⾯相关事件处理函数--监听⽤户下拉动作*/onPullDownRefresh: function() {},/*** 页⾯上拉触底事件的处理函数*/onReachBottom: function() {},/*** ⽤户点击右上⾓分享*/onShareAppMessage: function() {}})下⾯看下微信⼩程序正则判断⼿机号的⽰例代码var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\d{8})$/;if (this.data.Del.length == 0) {wx.showToast({title: '输⼊的⼿机号为空',icon: 'success',duration: 1500})return false;} else if (this.data.Del.length < 11) {wx.showToast({title: '⼿机号长度有误!',icon: 'success',duration: 1500})return false;} else if (!myreg.test(this.data.Del)) {wx.showToast({title: '⼿机号有误!',icon: 'success',duration: 1500})return false;} else {wx.showToast({title: '填写正确',icon: 'success',duration: 1500})}总结以上所述是⼩编给⼤家介绍的微信⼩程序⼿机号码验证功能的实例代码,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
手机端实现6位短信验证码input输入框效果(样式及代码方法)
⼿机端实现6位短信验证码input输⼊框效果(样式及代码⽅法)微信移动端4位、6位、多位验证码密码输⼊框功能的实现代码,实现思路:⽅案1:写⼀个简单的input框。
评估:样式不好看,待定。
⽅案2:就是⽤6个input框,每输⼊⼀个数字之后,切换到下⼀个input,即切换focus,删除的时候,同理。
⾃测发现安卓机很流畅,但ios微信端并不是那么流畅,ios默认输⼊法输⼊也有点瑕疵。
评估:感叹⼀下万能的安卓,吐槽下wechat⾥ios版本更新慢,该⽅案可能要pass。
⽅案3:⽤6个span标签。
即放置⼀个输⼊框,隐藏其⽂字和位置,label>span*6。
评估:解决了绝⼤多数问题,很多公司都是类似的⽅案。
最终结果:由于⼯程紧迫项⽬⼩,还考虑到⼀些其他外部原因,我们美丽的产品⼤⼈拍板了第⼀种⽅案。
虽说兜兜转转⼜回到了圆点,但是⼤⼈给我的启发实实不可忽略。
下⾯是我开Vue⼯程,打的demo:demo下⾯是Vue⼯程demo代码:Vue组件代码:template内容:<template><div class="input-captcha-20190115"><h3>栗⼦1:简单的input框</h3><div class="input-box"><input v-model.trim="simpleInput0" type="number" placeholder="请输⼊六位数字验证码"></div><br><br><h3>栗⼦2:由六个span代替输⼊框</h3><div class="input-box"><div class="tips">⽤六个span代替输⼊框:</div><label class="simple-input-content" for="simpleInput1"><span class="highlight">{{simpleInput1.slice(0,1)}}</span><span :class="simpleInput1.length > 1?'highlight':''">{{simpleInput1.slice(1,2)}}</span><span :class="simpleInput1.length > 2?'highlight':''">{{simpleInput1.slice(2,3)}}</span><span :class="simpleInput1.length > 3?'highlight':''">{{simpleInput1.slice(3,4)}}</span><span :class="simpleInput1.length > 4?'highlight':''">{{simpleInput1.slice(4,5)}}</span><span :class="simpleInput1.length > 5?'highlight':''">{{simpleInput1.slice(5,6)}}</span></label><div class="tips">要隐藏的输⼊框:</div><input id="simpleInput1" v-model.trim="simpleInput1" type="number" placeholder="请输⼊六位数字验证码"></div><br><br><h3>栗⼦3:由六个input组成</h3><div class="input-box"><div class="input-content"><input v-model.trim.number="input0" ref="input0" @keydown.8="deleteValue('input0','input0')" @keyup="changeValue($event,'input0','input1')" type="number" placeholder="空"> <input v-model.trim.number="input1" ref="input1" @keydown.8="deleteValue('input1','input0')" @keyup="changeValue($event,'input1','input2')" type="number" placeholder="空"> <input v-model.trim.number="input2" ref="input2" @keydown.8="deleteValue('input2','input1')" @keyup="changeValue($event,'input2','input3')" type="number" placeholder="空"> <input v-model.trim.number="input3" ref="input3" @keydown.8="deleteValue('input3','input2')" @keyup="changeValue($event,'input3','input4')" type="number" placeholder="空"> <input v-model.trim.number="input4" ref="input4" @keydown.8="deleteValue('input4','input3')" @keyup="changeValue($event,'input4','input5')" type="number" placeholder="空"> <input v-model.trim.number="input5" ref="input5" @keydown.8="deleteValue('input5','input4')" @keyup="changeValue($event,'input5','input5')" type="number" placeholder="空"> </div></div></template>View Template CodeVue组件代码:script内容:<script>export default {name: 'inputCaptcha',data () {return {simpleInput0: '',simpleInput1: '',input0: '',input1: '',input2: '',input3: '',input4: '',input5: ''}},methods: {deleteValue (inputValue, previousItem) { // 键盘按下时$event,当前input,上⼀个input console.log(this[inputValue], this[previousItem])if (this[inputValue].length > 0) { // 当前有值,清空之this[inputValue] = ''} else { // 当前没有值,光标跳转到上⼀个input,并清空该input值this.$nextTick(() => {this.$refs[previousItem].focus()this[previousItem] = ''this[inputValue] = ''})}},changeValue (e, inputValue, nextItem) { // 键盘抬起时$event,当前input,下⼀个input console.log(e.keyCode, this[inputValue], this[nextItem])if (e.keyCode !== 8) {this.$nextTick(() => {this.$refs[nextItem].focus() // 截取当前值最后⼀位,跳到下⼀个inputthis[inputValue] = (this[inputValue]).toString().slice(-1)})}}}}</script>View JavaScript CodeVue组件代码:style[lang=less]内容:<!-- Add "scoped" attribute to limit CSS to this component only --><style lang="less">.input-captcha-20190115 {min-height: 200px;.input-box {min-height: 100px;box-shadow: 0 0 5px 1px black;border-radius: 8px;width: 100%;max-width: 500px;display: inline-block;padding: 20px;box-sizing: border-box;input {vertical-align: middle;}& + .input-box {margin-top: 20px;}// 六个span时的样式.simple-input-content {label {padding: 20px;}span {vertical-align: middle;border: 1px solid silver;display: inline-block;height: 20px;width: 20px;&.highlight {border-color: purple;}}// 六个input时的样式.input-content {padding: 20px;input {width: 20px;height: 20px;text-align: center;}}/* 去掉input[type=number]浏览器默认的icon显⽰ */input::-webkit-outer-spin-button,input::-webkit-inner-spin-button { // chrome-webkit-appearance: none;appearance: none;margin: 0;}input{ // ⽕狐-moz-appearance:textfield;}}}</style>View Style CodeVue挂载标签<div id="app20190115"></div>样式:<style>#app20190115 {text-align: center;color: #2c3e50;border: 1px solid silver;}.tips {color: #666}</style>Vue⼯程demo中的知识点:。
微信小程序实现随机验证码功能
微信⼩程序实现随机验证码功能本⽂实例为⼤家分享了微信⼩程序实现随机验证码的具体代码,供⼤家参考,具体内容如下效果图:⼩程序上经常会有⼀些注册申请页⾯需要⽤到随机验证码。
具体实现⽅法不多说直接上代码<view class='yanzhengma'><text class='left'>{[code]}</text><text class='right' bindtap='huanyizhang'>换⼀张</text></view>CSS:.yanzhengma {height: 100rpx;display: flex;align-items: center;justify-content: center;}.yanzhengma .left {font-family: Arial;font-style: italic;font-weight: bold;border: 0;letter-spacing: 3px;font-size: 18px;background-color: #ccc;padding: 10rpx;margin-right: 20rpx;color: blue;}js:Page({data: {},/*** ⽣命周期函数--监听页⾯加载*/onLoad: function(options) {//刚进⼊页⾯随机先获取⼀个this.createCode()},huanyizhang(){this.createCode()},createCode() {var code;//⾸先默认code为空字符串code = '';//设置长度,这⾥看需求,我这⾥设置了4var codeLength = 4;//设置随机字符var random = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'); //循环codeLength 我设置的4就是循环4次for (var i = 0; i < codeLength; i++) {//设置随机数范围,这设置为0 ~ 36var index = Math.floor(Math.random() * 36);//字符串拼接将每次随机的字符进⾏拼接code += random[index];}//将拼接好的字符串赋值给展⽰的codethis.setData({code: code})},})以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Java调用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=".csrc.base.action.FindAllData"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServe rPort()+ 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"><linkhref="<%=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.j s"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}/imag e.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="use rname" id="username" cssStyle="width:160px;height:24px;" onblur="checkuserna me()"/></td><td align="left" width="30%"><span id="usernameTip" ><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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="pass word" id="password" cssStyle="width:160px;height:24px;" onblur="checkpasswor d()"/></td><td align="left" width="30%"><span id="passwordTip" ><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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="pass wordRepeat" id="passwordRepeat" cssStyle="width:160px;height:24px;" onblur=" checkpasswrodb()"/></td><td align="left" width="30%"><span id="passwordRepe atTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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="nic kname" id="nickname" cssStyle="width:160px;height:24px;" onblur="checknickna me()"/></td><td align="left" width="30%"><span id="nicknameTip" ><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>nickname</s:param></s:fielderror></span></td></tr><tr><td align="center" width="30% ">性别:</td><td align="center" width="40% "><s:radio list="#applic ation.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="jbA ddress" 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:para m>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="jbPho ne" 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:para m>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="SmsCh eckCode" name="SmsCheckCode" cssStyle="width:80px;height:24px;" maxLength="6 " /><span><input type="but ton" id="btnSendCode" name="btnSendCode" value="免费获取验证码" onclick="sendMessage()" /></span><span id="SmsCheckCode Tip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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.d ataMap.get('10002')" label=""headerKey="" h eaderValue="--请选择--" value="1" listValue="value" onchange="enableCredentialsCode(this)"name="jbCredent ialsName" id="jbCredentialsName" cssStyle="width:160px;height:24px;"/></td><td align="left" width="30%"><s:fielderror cssStyle ="color:red;padding-left:10px;"><s:param>jbCred entialsName</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="jbC redentialsCode" id="jbCredentialsCode" cssStyle="width:160px;height:24px;" o nblur="checkjbCredentialsCode()"/></td><td align="left" width="30%"><span id="jbCredential sCodeTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>jbCredentialsCode</s:param></s:fielderror></span></td></tr><tr><td align="center" width="30% ">单位名称:</td><td align="center" width="40% "><s:textfield name="jbC ompanyName" id="jbCompanyName" cssStyle="width:160px;height:24px;" /></td><td align="left" width="30%"><span id="jbCompanyNam eTip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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.d ataMap.get('10003')" label=""headerKey="" h eaderValue="--请选择--" listKey="key"cssStyle="width :160px;height:24px;" listValue="value" id="jbSourceArea"name="jbSourceA rea" onblur="checkjbSourceArea()"/></td><td align="left" width="30%"><span id="jbSourceArea Tip"><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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="check Num" name="checkNum" cssStyle="width:60px;height:24px;" onblur="checkNumber( )" maxLength="4"/><img id="checkNumImage " src="${pageContext.request.contextPath}/image.jsp"><a onClick="changeChec kNum()" title="点击换一张" style="cursor:hand;"> 换一张</a></td><td align="left" width="30%"><span id="checkNumTip" ><s:fielderror cssStyle="color:red;padding-left:10px;"><s:para m>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" v alue="重置" style="width:50px; height:24px;"/></td></tr></table></s:form></div></div><%@include file="/common/buttom.jspf"%></body></html>三:前台获取短信验证码的js:sms.jsvar 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).toStrin g();}// 设置button效果,开始计时$("#btnSendCode").attr("disabled", "true");$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");InterValObj = window.setInterval(SetRemainTime, 1000 ); // 启动计时器,1秒执行一次// 向后台发送处理数据$.ajax({type: "POST", // 用POST方式传输dataType: "text", // 数据格式:JSONurl: "UserAction_sms.action", // 目标地址data: "jbPhone=" + jbPhone +"&code=" + co de,error: function (XMLHttpRequest, textStatus, errorThrown) {},success: function (data){data = parseInt(data, 10);if(data == 1){$("#jbPhoneTip").html("<font c olor='#339933'>√短信验证码已发到您的手机,请查收</font>");}else if(data == 0){$("#jbPhoneTip").html("<font c olor='red'>×短信验证码发送失败,请重新发送</font>");}else if(data == 2){$("#jbPhoneTip").html("<font c olor='red'>×该手机号码今天发送验证码过多</font>");}}});}}else{$("#jbPhoneTip").html("<font color='red'>×手机号码不能为空</font>");}}//timer处理函数function SetRemainTime() {if (curCount == 0) {window.clearInterval(InterValObj);// 停止计时器$("#btnSendCode").removeAttr("disabled");// 启用按钮$("#btnSendCode").val("重新发送验证码");code = ""; // 清除验证码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
遇到一个手机APP项目
客户要求注册到APP上的用户手机号必须是真实的
通过X5平台整合短信发送平台接口完成了这个功能,拿出来和大家分享一下。
项目的总体思路:
1、用户在注册页面上填写手机号,按“获取短信验证码”按钮
2、通过servlet将这个手机号传到后台
3、通过java生成一个6位数字的字符串
4、把这个字符串返回前台,同时把这个字符串通过短信发送平台发给用户注册的手机号
5、用户吧接收到的短信验证码输入到inpu框
6、浏览器把从后台接收到的验证码与用户输入的验证码进行比较,如果一致则允许客户注册,如果不一致则拒绝
前台展示界面如图:
当用户输入手机号后按短信验证码”按钮的事件是
Model.prototype.button2Click = function(event){
//当用户输入手机号后,按短信验证码的处理动作
//此处为检查手机号和密码是否符合规则的代码,省略
//把手机号发往后台
var params = {
"fCellphone":p("haircutterData").getValue("fCellphone")
};
// 请求成功后的回调方法
var success = function(resultData) {
//拿到从后台返回的验证码
alert(resultData.CheckCode);
};
// 向后台发送请求
Baas.sendRequest({
"url" : "/haircut", // servlet请求地址
"params" : params, // action对应的参数
"action" : "checkCodeAction", // action
"success" : success // 请求成功后的回调方法
});
};
后台我使用的是中国网建的短信发送平台,后台的servlet接口的动作函数如下(各种配置、转接、请参考相关视频文件)
引入的短信平台和生成随机数的jar包:(短信发送平台的Jar包可以在中国网建的网站上下载)
import java.util.Random;
import mons.httpclient.Header;
import mons.httpclient.HttpClient;
import ValuePair;
import mons.httpclient.methods.PostMethod;
//查询向短信发送器发送随机验证码,同时把验证码送回前端
private static void checkCodeAction(ServletRequest request, ServletResponse response) throws SQLException, IOException, NamingException , Exception{
// 参数序列化
JSONObject params = (JSONObject) JSONObject.parse(request.getParameter("params"));
// 拿到前台传过来的手机号
String fCellphone = params.getString("fCellphone");
//生成6位数字的随机字符串
int suiji = new Random().nextInt(899999)+100000;
String backStr=Integer.toString(suiji);
// 将随机字符串通过jsonOBJ返回前台
JSONObject jsonObj = new JSONObject();
jsonObj.put("CheckCode", backStr);
Util.writeJsonToResponse(response, jsonObj);
//把这个随机数发到短信平台de
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
NameValuePair[] data ={ new NameValuePair("Uid", "用户名"),new NameValuePair("Key", "我用户名的短信密钥"),new NameValuePair("smsMob",fCellphone),new NameValuePair("smsText","验证码:"+backStr+" (本信息由系统自动发出,不要回复)")};
//这段Java代码是直接从他家demo拷贝下来的,只需要修改这句话,填写你在他家注册的用户名、短信密钥,参数中加要发送的手机号和验证码短信
post.setRequestBody(data);
try{
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); //打印返回消息状态
}
finally{
post.releaseConnection();
}
}。