短信验证码

article/2025/8/28 20:10:28

写一个发送验证码的功能,需要实现第三方接口,一般采用阿里的接口


第一步:登录阿里大于官网,只需淘宝号即可。


第二步:申请验证码中的签名和短信模板,审核通过即可测试

第三步:下载阿里大于的jar包,根据自己的环境下载什么类型的jar包(sdk-java-2016-06-07.zip)


第四步:解压,引入项目中的,lib文件夹下面

taobao-sdk-java-auto_1455552377940-20160607.jar


第五步:代码实现功能

写短信验证工具类:

记得 利用第三方json框架处理json格式的字符串.
      google (gson).
      -- gson-2.2.4.jar导入lib文件夹下面

/*** */
package cn.oa.core.common.sms;import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.taobao.api.ApiException;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;
import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse;/*** @Description:短信验证工具类* @Package cn.oa.core.common.sms* @date 2016年8月24日上午8:51:04* @author jeo_chow* @blog http://blog.csdn.net/jeo_chow* @version V1.0*/
public class SMSUtils {/** 短信接口的请求地址 */public static final String SMS_REQUEST_URL = "http://gw.api.taobao.com/router/rest";/** ################# 需要根据情况填写下面的属性 #################### *//** 应用的Key */private static final String APP_KEY = "23439439";/**  应用的签名 */private static final String APP_SECRET = "e0c1e4025545982deee4bfbe29f5ca3c";/** 短信签名 */private static final String SMS_FREE_SIGN_NAME = "六扇门oa办公";/** 短信模板ID */private static final String SMS_TEMPLATE_CODE = "SMS_13186489";/*** 验证码短信发送方法* * @param code*            验证码* @param phones*            手机号码* @return true 发送成功,false 发送失败*/public static boolean send(String code, String phones) {try {/*** 创建淘宝客户端 参数一:请求URL(短信接口的请求地址) 参数二:应用的Key 参数三:应用的签名* 方法里面的参数用常量定义。可以随时改*/TaobaoClient client = new DefaultTaobaoClient(SMS_REQUEST_URL,APP_KEY, APP_SECRET);/** 构建短信发送请求对象 */AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();/** ######################### 封装请求参数 ############################ *//*** 公共回传参数,在“消息返回”中会透传回该参数;举例:用户可以传入自己下级的会员ID,* 在消息返回时,该会员ID会包含在内,用户可以根据该会员ID识别是哪位会员使用了你的应用 (可选)*/req.setExtend("六扇门捕神传来成功消息");/*** 短信类型,传入值请填写normal (必须)*/req.setSmsType("normal");/*** 短信签名,传入的短信签名必须是在阿里大于“管理中心-短信签名管理”中的可用签名。* 如“阿里大于”已在短信签名管理中通过审核,则可传入”阿里大于“(传参时去掉引号)作为短信签名。* 短信效果示例:【阿里大于】欢迎使用阿里大于服务。 (必须)*/req.setSmsFreeSignName(SMS_FREE_SIGN_NAME);/*** 短信模板ID,传入的模板必须是在阿里大于“管理中心-短信模板管理”中的可用模板。 示例:SMS_585014 (必须)*/req.setSmsTemplateCode(SMS_TEMPLATE_CODE);/*** 短信模板变量,传参规则{"key":"value"},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开。* 示例:针对模板“验证码${code},您正在进行${product}身份验证,打死不要告诉别人哦!”,* 传参时需传入{"code":"1234","product":"alidayu"}* 验证码${number},您正进行身份验证,打死不告诉别人! (可选)*/req.setSmsParamString("{\"number\":\"" + code + "\"}");/*** 短信模板变量,传参规则{"key":"value"},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开。* 示例:针对模板“验证码${code},您正在进行${product}身份验证,打死不要告诉别人哦!”,* 传参时需传入{"code":"1234","product":"alidayu"}* 验证码${number},您正进行身份验证,打死不告诉别人! (可选)*/req.setRecNum(phones);/** 执行请求得到响应对象 */AlibabaAliqinFcSmsNumSendResponse response = client.execute(req);/*** {"alibaba_aliqin_fc_sms_num_send_response": {"result":* {"model":"102576995949^0","success":true},* "request_id":"44nzz2ck96uq" } }*//** 获取响应数据 */String responseData = response.getBody();if (responseData.contains("success")) {// JsonObject: {}// JsonArray: []/** 使用第三方插件 创建gson对象 */Gson gson = new Gson();return gson.fromJson(responseData, JsonObject.class).getAsJsonObject("alibaba_aliqin_fc_sms_num_send_response").getAsJsonObject("result").get("success").getAsBoolean();}return false;} catch (ApiException e) {e.printStackTrace();}return false;}
}

写一个简单的发送短信验证码jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>办公管理系统-短信验证码</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="pragma" content="no-cache"/><meta http-equiv="Cache-Control" content="no-cache, must-revalidate"/><meta name="Keywords" content="keyword1,keyword2,keyword3"/><meta name="Description" content="网页信息的描述" /><meta name="Author" content="fkjava.org" /><meta name="Copyright" content="All Rights Reserved." /><link href="${path}/logo.ico" rel="shortcut icon" type="image/x-icon" /><link href="${path}/css/common/admin.css" type="text/css" rel="stylesheet"/><script type="text/javascript" src="${path}/js/jquery-1.11.3.min.js"></script><script type="text/javascript" src="${path}/js/jquery-migrate-1.2.1.min.js"></script><script type="text/javascript" src="${path}/js/jquery-timer-1.0.js"></script><script type="text/javascript">$(function(){/** 为获取验证码按钮绑定点击事件 */$("#verifyBtn").click(function(){/** 发送异步请求 */$.ajax({url : "${path}/sendSMSAjax.jspx",type : "post",data : {phone : $("#phone").val()}, // 请求参数dataType : "text",async : true,success : function(data){if ($.parseJSON(data)){/** 使当前按钮失效 */$("#verifyBtn").attr("disabled", true).countDown("{0}秒后重新获取验证码", 60);}},error : function(){alert("数据加载失败!");}});});});</script></head>
<body><br/><table align="center" class="editTable" cellpadding="8" cellspacing="1"><s:actionerror/><s:fielderror/><tbody style="background-color: #FFFFFF;"><s:form action="/admin/updateSelf.jspx" method="post" id="updateSelfForm" theme="simple"><s:token></s:token><tr><td width="65px;">手机号码:</td><td><input type="text" name="phone" size="18" id="phone"/></td></tr><tr><td>验证码:</td><td><input type="text" name="phone" size="18"/><input type="button"  value="获取验证码" id="verifyBtn"/></td></tr></s:form></tbody></table>
</body>
</html>


配置发送异步请求的xml文件


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><!-- 配置Struts2常量 --><constant name="struts.enable.DynamicMethodInvocation" value="false"/><constant name="struts.devMode" value="true" /><constant name="struts.action.extension" value="jspx,action,do"/><!-- 配置全局的国际化资源文件 --><constant name="struts.custom.i18n.resources" value="oa_messages"></constant><package name="oa" namespace="/" extends="json-default"><!-- 全局结果配置 --><!-- 全局异常配置 --><global-exception-mappings><exception-mapping exception="java.lang.Exception" result="error"/></global-exception-mappings><!-- 图形验证码 --><action name="verify" class="cn.oa.core.action.VerifyAction"></action><!-- 异步发送验证码 --><action name="sendSMSAjax" class="cn.oa.core.action.SmsVerifyAction"><result type="json"><!-- 记得加上enableGZIP --><param name="root">smsSuccess</param></result></action></package><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">     	</span>

   	<!-- 引入子文件 --><include file="cn/oa/admin/struts-admin.xml"></include>
</struts>


异步请求处理类 短信验证码控制器

/*** */
package cn.oa.core.action;import java.util.UUID;import cn.oa.core.common.sms.SMSUtils;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/*** @Description:短信验证码控制器* @Package cn.oa.core.action* @date 2016年8月24日下午6:58:06* @author jeo_chow* @blog http://blog.csdn.net/jeo_chow* @version V1.0*/
public class SmsVerifyAction extends ActionSupport {/** 定义存入在Session短信验证码 */public static final String SMS_VERIFY_CODE = "sms_verify_code";/** 定义手机号码 */private String phone;/** 定义短信是否发送成功的Field */private boolean smsSuccess;/** (non-Javadoc)* * @see com.opensymphony.xwork2.ActionSupport#execute()*/@Overridepublic String execute() {try {/** 随机生成四位数字的验证码 */String code = UUID.randomUUID().toString().replaceAll("[a-z|-]", "").substring(0, 4);smsSuccess = SMSUtils.send(code, phone);if (smsSuccess) {/** 存入Session中用于验证判断的 */ActionContext.getContext().getSession().put(SMS_VERIFY_CODE, code);}} catch (Exception e) {e.printStackTrace();}return SUCCESS;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public boolean getSmsSuccess() {return smsSuccess;}public void setSmsSuccess(boolean smsSuccess) {this.smsSuccess = smsSuccess;}}

按钮上要求显示倒计时时间,写一个自定义的插件(
jquery-timer-1.0.js

/*** jQuery日期插件* 匿名函数*/
(function($) {/** * 倒计时的方法* text:显示的文本* seconds:秒数* */countDown:function(text,seconds){if(seconds>1){/** 自减*/seconds--;/** 替换掉text中的占位符{0}*/var res =text.replace("{0}",seconds);/** 为按钮添加value属性值*/this.val(res);var obj=this;/** 开启延迟的定时器*/setTimeout(function(){obj.countDown(text,seconds);},1000);}else {/** 按钮变成亮色状态*/$(this).attr("disabled",false).val("重新获取验证码");}}});})(jQuery);

完成了之后就可以测试了!



http://chatgpt.dhexx.cn/article/WCrDNkhu.shtml

相关文章

Win-mac版 AE 2018安装附教程

链接:https://pan.baidu.com/s/17QXFuotLoPmqDQa8DBBRrA?pwdw106 提取码:w106

AE2022最新功能简介

没有什么是您无法使用 After Effects 创建的。 创建电影电影标题、简介和转场。从剪辑中移除对象。生火或下雨。为徽标或角色设置动画。甚至在 3D 空间中导航和设计。借助行业标准的 动态图形 和 视觉效果软件After Effects&#xff0c;您可以将任何想法付诸实践。 ​下载&…

AE圣诞树(html版本),免费

最近网上很火的AE圣诞树&#xff0c;这里免费提供给大家HTML版本 源码和视频下载&#xff1a;https://download.csdn.net/download/qq_56088882/87260627

最新版Adobe2023:After Effects 2023(Ae2023) win/mac版中文特别版

Adobe After Effects 2023(AE2023)它用于视频处理后期制作、创建音乐视频、广告、动画、标题以及许多其他需要数字视频效果的元素。Adobe After Effects提供了出色的控制功能、广泛的创意工具以及与其他视频应用程序集成的能力。由于第三方开发的大量插件库&#xff0c;Adobe A…

解决PR AE 2018打不开,且桌面出现报错文件

1.win11系统安装完pr2018之后&#xff0c;出现了如下报错的文件。 2.排查 安装包是之前笔记本常用的一直没报错&#xff0c;用压缩包封装着不存在文件的缺失。 经过查阅Adobe官方文档发现这是版本未优化的BUG,大部分存在于使用独显的电脑。有相关问题的朋友可以尝试替换高版本…

水清冷冷:AE CC2018安装图文教程攻略(附工具),windows系统64位

工具分享在底部 随着短视频时代热潮到来&#xff0c;水清冷冷觉得&#xff0c;一些懂视频剪辑和特效制作的人才也越来越吃香&#xff0c;自己做自媒体或帮企业制作视频等&#xff0c;都能有好的发展前景。当然像PR剪辑软件和AE特效制作软件还是需要一定的专业水平的&#xff0c…

星际争霸2人工智能研究环境SC2LE完全入门指南

&#xfeff;&#xfeff; 迈向通用人工智能&#xff1a;星际争霸2人工智能研究环境SC2LE完全入门指南 Kun Ni 飞行器控制专业博士 86 人赞了该文章 题图来源&#xff1a;http://www.neogaf.com/forum/showthread.php?t1401417&amp;amp;amp;amp;page1 版权说明&#xff1a…

QT学习之基础Day1(自用)

1.Qt是什么&#xff1f; Qt&#xff08;官方发音 [kju:t]&#xff0c;音同 cute&#xff09;是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&#xff0c;当然也可以开发不带界面的命令行&…

Spring学习(六):WebFlux

文章目录 WebFlux概述简介异步非阻塞 响应式编程简介Reactor实现简介三种信号特点操作符示例代码 SpringWebflux执行流程和核心API执行流程核心API SpringWebflux基于注解编程SpringWebflux基于函数式编程具体步骤示例代码 WebFlux概述 简介 WebFlux是Spring5新添加的模块以用…

Spring Web vs Spring Webflux

当你需要构建Web应用程序时&#xff0c;Spring Web 和 Spring Webflux 是Spring生态系统中的两个框架&#xff0c;但它们之间有一些关键区别。 Spring Web 是一个传统的Web框架&#xff0c;它构建在Servlet API之上。它旨在处理阻塞式I/O&#xff0c;即线程在从数据库或其他服务…

Spring Boot(5)之 WebFlux 响应式编程

1、WebFlux简介 springWebFlux 是 SpringFrameworl5.0 添加的新功能&#xff0c;WebFlux 本身是追随当下最火的 Reactive Programming 而诞生的框架&#xff0c;那么本编就来简述下这个框架到底是做什么的。 参考&#xff1a;Spring-WebFlux简介与使用 1.1、关于WebFlux 我们…

对比WebFlux和WebMVC (为什么使用WebFlux)

对比WebFlux和WebMVC (为什么使用WebFlux) 1.0 WebFlux吞吐量对比WebMVC 2.0 WebFlux延迟/CPU对比WebMVC 3.0 WebFlux内存使用对比WebMVC 4.0 WebFlux最大处理请求对比WebMVC 1

Spring(十)Webflux

Webflux 1、SpringWebflux 介绍 &#xff08;1&#xff09;是 Spring5 添加新的模块&#xff0c;用于 web 开发的&#xff0c;功能和 SpringMVC 类似的&#xff0c;Webflux 使用当前一种比较流程响应式编程出现的框架。 &#xff08;2&#xff09;使用传统 web 框架&#xff…

Spring:Webflux响应式编程

目录 简介响应式编程Reactor信号操作符 SpringWebflux 执行流程和API 注解实现SpringWebflux 说明&#xff1a;基于atguigu学习笔记。 简介 Webflux是 Spring5 添加新的模块&#xff0c;用于 web 开发的&#xff0c;功能和 SpringMVC 类似的&#xff0c;Webflux 使用当前一种比…

WebFlux入门详解

文章目录 一、 WebFlux介绍1、什么是 WebFlux2、反应式库介绍2.1 Reactive Stream2.2 Reactor2.3 Reactive Stream、Reactor 和 WebFlux 关系 二、入门WebFlux1、简单介绍2、简单的例子构造 三、WebFlux与数据库1、介绍2、r2dbc实战前期准备2.1 引入依赖与配置2.2 创建数据表2.…

springboot之webmvc和webflux浅析

webmvc和webflux作为spring framework的两个重要模块&#xff0c;代表了两个IO模型&#xff0c;阻塞式和非阻塞式。 1、webmvc webmvc是基于servlet的阻塞式模型&#xff0c;一个请求到达服务器后会单独分配一个线程去处理请求&#xff0c;如果请求包含IO操作&#xff0c;线程…

Webflux核心

什么是WebFlux? Spring WebFlux 是一套全新的 Reactive Web 栈技术&#xff0c;实现完全非阻塞&#xff0c;支持 Reactive Streams 背压等特性&#xff0c;并且运行环境不限于 Servlet 容器&#xff08;Tomcat、Jetty、Undertow&#xff09;&#xff0c;如 Netty 等。Spring W…

SpringBoot Webflux解析

1. Webflux介绍 Webflux是一种异步非阻塞的IO模型&#xff0c;当有请求过来时&#xff0c;它会将请求交由worker线程去处理&#xff0c;这样就可以极大的提升吞吐量&#xff0c;所以他比较适合用于IO密集型的场景。 webflux虽然可以给我带来吞吐量的提升&#xff0c;但是同时也…

Webflux快速入门

传统的Web框架&#xff0c;如struts2&#xff0c;springmvc等都是基于Servlet API与Servlet容器基础之上运行的&#xff0c;在Servlet3.1之后才有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架&#xff0c;它的核心是基于Reactor的相关API实现的。相对于传统的web框…

Spring-webflux 响应式编程

热爱可抵漫长岁月 文章目录 1. 前言2. Spring-webflux简介3. 什么是“响应式”4. Spring-webflux的响应式API5. Spring MVC 还是 WebFlux&#xff1f;6. 并发模型7. webflux使用8. 测试 1. 前言 Spring 提供了两个并行堆栈。一种是基于带有 Spring MVC 和 Spring Data 结构的 …