1.为什么需要验证码
手机验证码是一种用于验证用户身份的短信或语音信息。当你在注册账号、登录、进行支付等操作时,系统会向你的手机发送一个包含数字和字母的验证码。你需要将该验证码输入到相应的页面或应用程序中,以完成身份验证。手机验证码的目的是确保只有拥有手机的用户才能进行特定操作,增加账户安全性。
2.有什么可以帮助我们发送验证码
2.1 使用什么发送验证码
-
阿里云短信服务:阿里云提供了短信服务,开发者可以使用其API接口来发送手机验证码。
-
腾讯云短信服务:腾讯云也提供了短信服务,开发者可以使用其API接口来发送手机验证码。
-
云片网短信服务:云片网是一家专注于短信服务的第三方平台,开发者可以通过其提供的API接口来发送手机验证码。
-
Twilio短信服务:Twilio是一家国际知名的通信服务提供商,其也提供了短信服务,可以用于发送手机验证码等短信内容。
2.2 发送验证码的种类有哪些
-
纯数字验证码:由一串纯数字组成的验证码,通常包含4-6位数字。
-
数字字母混合验证码:由数字和字母组成的验证码,通常包含4-6位字符,可以是大小写字母和数字的组合。
-
动态验证码:每次生成的验证码都不同,可以是纯数字、数字字母混合或其他形式的验证码。动态验证码的特点是具有时效性,一般在一定时间内有效,过期后需要重新获取。
-
图形验证码:将验证码以图片形式展示,并通过短信发送给用户。用户需要根据图片中的内容输入相应的信息进行验证。
-
随机密码验证码:除了传统的验证码形式外,还有一种是通过随机生成一段密码,并将该密码通过短信发送给用户,在验证时要求用户输入该密码。
3.如何使用java发送验证码
3.1使用什么发送验证码
在这里其实阿里云他,腾讯云等等。发送验证码都是一样的方式,学会后可以去去其他的平台试一试。
3.2如何发送验证码
1.首先进入网页
阿里云-计算,为了无法计算的价值 (aliyun.com)https://www.aliyun.com/?utm_content=se_1012431275
2.登陆
3.扫码进入
4.进入主页后,搜索短信服务,找到我们发送验证码界面
短信服务 (aliyun.com)https://dysms.console.aliyun.com/overview
5.点击注册模板
注册我们需要的模板信息
6.添加测试手机号码
7.导入maven依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
8.导入util类
package servlet;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
public class SendSMSUtil {
// 你的accessKeyId
private static final String accessKeyId = "LTAI5tLqq1kwy5DpHnHRGFdX";
// 你的accessKeySecret
private static final String accessKeySecret = "nRT4yfsJj0hszFiqFozAZOUIihgOiM";
// 上面设置的签名
private static final String signName = "智慧考试管理系统";//
// 短信模板,模板code
private static final String templateCode = "SMS_461450614";
private static int code;
// phoneNumber必须当做参数传入
public String senSMSUtil(String phoneNumber) {
// 设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化ascClient需要的几个参数
final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
// 初始化ascClient,暂时不支持多region(请勿修改)
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
} catch (ClientException e) {
e.printStackTrace();
}
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象
SendSmsRequest request = new SendSmsRequest();
// 使用post提交
request.setMethod(MethodType.POST);
// 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,
// 验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“85200000000”
request.setPhoneNumbers(phoneNumber);
request.setSignName(signName);
// 必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode(templateCode);
//随机生成六位验证码
code = (int) ((Math.random() * 9 + 1) * 100000);
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
// 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
request.setTemplateParam("{code:" + code + "}");
// 请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse = acsClient.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
return "请求失败";
}
assert sendSmsResponse.getCode() != null;
// 获取错误码,如果你账户没钱会返回isv.AMOUNT_NOT_ENOUGH,表示账户没钱,充点钱就行了
System.out.println(sendSmsResponse.getCode());
if (sendSmsResponse.getCode() == null || !sendSmsResponse.getCode().equals("OK")) {// 发送不成功
return sendSmsResponse.getMessage();
}
// 请求成功
return "OK";
}
public int getCode() {
return code;
}
}
9.修改成我们的验证码信息
10.测试类调用实现发送验证码
PrintWriter out = null;
try {
out = resp.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
String phoneNumber = req.getParameter("phone");
System.out.println(phoneNumber);
// 发送短信
SendSMSUtil sendSMS = new SendSMSUtil();
String result = sendSMS.senSMSUtil(phoneNumber);
if (result == null || !result.equals("OK")) {// 发送不成功
System.out.println("失败");
}
// 获取验证码
int code = sendSMS.getCode();
// 将数据存入SESSION
// 将验证码生成时间存入SESSION,若超过五分钟则不通过校验
// 将验证码生成时间存入SESSION,若超过五分钟则不通过校验