下面是Java实现短信验证码5分钟有效时间的攻略:
1. 生成验证码
我们可以使用Java的Random类生成随机的4-6位数字作为验证码。示例代码如下:
import java.util.Random;
public class VerificationCodeUtil {
public static String generateVerificationCode(int length) {
Random random = new Random();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append(random.nextInt(10));
}
return builder.toString();
}
}
上面的代码中,generateVerificationCode()方法接受一个int类型的参数length,用于指定验证码的位数。我们可以在调用时传入4、5或6等数字。这里我们生成的验证码仅包含数字,不包含字母,因为数字更容易被人类识别和记忆。
2. 存储验证码
要在服务器端实现短信验证码5分钟有效时间的功能,我们需要使用一个数据存储介质来存储验证码和过期时间。这个数据存储介质可以是数据库、缓存或者内存等。这里我们使用内存作为存储介质。示例代码如下:
import java.util.HashMap;
import java.util.Map;
public class VerificationCodeManager {
private static final Map<String, String> verificationCodes = new HashMap<>();
public static void saveVerificationCode(String phoneNumber, String code) {
verificationCodes.put(phoneNumber, code);
}
public static String getVerificationCode(String phoneNumber) {
return verificationCodes.get(phoneNumber);
}
public static void removeVerificationCode(String phoneNumber) {
verificationCodes.remove(phoneNumber);
}
}
VerificationCodeManager类使用一个Map对象来存储验证码和手机号的对应关系。我们可以调用saveVerificationCode()方法来将验证码和手机号保存到Map对象中;调用getVerificationCode()方法来获取指定手机号对应的验证码;调用removeVerificationCode()方法来从Map对象中删除指定手机号对应的验证码。
3. 发送短信
我们可以使用第三方短信平台,如阿里云、腾讯云等,来发送短信验证码。这里以阿里云为例,示例代码如下:
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SmsUtil {
private static final Logger logger = LoggerFactory.getLogger(SmsUtil.class);
public static void sendSms(String phoneNumber, String code) {
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessKeySecret>");
IAcsClient client = new DefaultAcsClient(profile);
try {
CommonResponse response = client.getCommonResponse(new SendSmsRequest()
.setMethod(MethodType.POST)
.setDomain("dysmsapi.aliyuncs.com")
.setVersion("2017-05-25")
.setAction("SendSms")
.putQueryParameter("PhoneNumbers", phoneNumber)
.putQueryParameter("SignName", "<signName>")
.putQueryParameter("TemplateCode", "<templateCode>")
.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}")
);
logger.info(response.getData());
} catch (ServerException e) {
logger.error("Failed to send SMS:", e);
} catch (ClientException e) {
logger.error("Failed to send SMS:", e);
}
}
}
上面的代码中,sendSms()方法接受一个String类型的phoneNumber和一个String类型的code,分别表示要发送短信的手机号和验证码。我们需要在代码中填入阿里云的accessKeyId和accessKeySecret、短信签名和短信模板等参数。此外,我们使用了Slf4j日志框架来记录发送短信的结果。
4. 校验验证码
在校验验证码时,我们需要判断当前时间和验证码的过期时间是否在5分钟内。示例代码如下:
public class VerificationCodeUtil {
public static boolean isVerificationCodeValid(String phoneNumber, String code) {
String storedCode = VerificationCodeManager.getVerificationCode(phoneNumber);
if (!code.equals(storedCode)) {
return false;
}
long storedTime = TimeManager.getVerificationCodeTime(phoneNumber);
long currentTime = System.currentTimeMillis();
if (currentTime - storedTime > 5 * 60 * 1000) {
return false;
}
return true;
}
}
public class TimeManager {
private static final Map<String, Long> verificationCodeTimes = new HashMap<>();
public static void saveVerificationCodeTime(String phoneNumber) {
verificationCodeTimes.put(phoneNumber, System.currentTimeMillis());
}
public static long getVerificationCodeTime(String phoneNumber) {
return verificationCodeTimes.get(phoneNumber);
}
}
上面的代码中,isVerificationCodeValid()方法接受一个String类型的phoneNumber和一个String类型的code,分别表示要校验的手机号和验证码。我们首先从VerificationCodeManager中获取存储的验证码,然后再从TimeManager中获取存储的验证码时间。如果验证码不匹配或者过期时间超过5分钟,返回false,否则返回true。
示例说明
下面是两个示例说明:
示例一
用户输入手机号并点击获取验证码按钮,页面请求后台生成验证码并通过短信平台发送一条短信到用户手机里。5分钟后用户将该短信里的验证码输入网站,网站校验该验证码并验证通过。
// 用户请求获取验证码
@RequestMapping("/sendVerificationCode")
public void sendVerificationCode(@RequestParam("phoneNumber") String phoneNumber) {
// 生成随机验证码并发送到指定手机号
String code = VerificationCodeUtil.generateVerificationCode(4);
SmsUtil.sendSms(phoneNumber, code);
// 将验证码和过期时间存储起来
VerificationCodeManager.saveVerificationCode(phoneNumber, code);
TimeManager.saveVerificationCodeTime(phoneNumber);
}
// 用户提交验证码进行验证
@RequestMapping("/verify")
public Result verify(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("verificationCode") String verificationCode) {
if (!VerificationCodeUtil.isVerificationCodeValid(phoneNumber, verificationCode)) {
return Result.error("验证码错误或已失效,请重新获取");
}
// 验证通过
return Result.success();
}
在示例一中,我们首先在后台生成一个4位数的验证码,并将该验证码通过短信平台发送到指定的手机号。然后将该验证码和当前时间存储到VerificationCodeManager和TimeManager中。用户在5分钟内输入该验证码时,我们可以通过调用isVerificationCodeValid()方法来验证该验证码是否正确和有效。
示例二
用户填写手机号码和密码后,点击注册按钮,前台向后台发送AJAX请求,后台随机生成一个5位数的短信验证码,并通过短信平台发送到用户手机上,发送成功后返回一个成功提示。用户在短信验证码有效的5分钟内输入该验证码并点击提交注册信息按钮,后台验证该验证码的正确性,如果正确,将注册信息写入数据库中。
// 用户请求发送短信验证码
@RequestMapping("/sendSmsCode")
public Result sendSmsCode(@RequestParam("phoneNumber") String phoneNumber) {
// 检查手机号是否已经注册过账户
if (userService.getUserByPhoneNumber(phoneNumber) != null) {
return Result.error("该手机号已经注册,请直接登录");
}
// 生成5位数的数字验证码,发送到指定手机号
String code = VerificationCodeUtil.generateVerificationCode(5);
SmsUtil.sendSms(phoneNumber, code);
// 将验证码和过期时间存储起来
VerificationCodeManager.saveVerificationCode(phoneNumber, code);
TimeManager.saveVerificationCodeTime(phoneNumber);
return Result.success();
}
// 用户提交手机号、密码和短信验证码进行注册
@RequestMapping("/register")
public Result register(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("password") String password, @RequestParam("smsCode") String smsCode) {
if (!VerificationCodeUtil.isVerificationCodeValid(phoneNumber, smsCode)) {
return Result.error("验证码错误或已失效,请重新获取");
}
// 短信验证码验证通过,将用户注册信息写入数据库
User user = new User();
user.setPhoneNumber(phoneNumber);
user.setPassword(password);
userService.createUser(user);
return Result.success();
}
在示例二中,我们通过AJAX请求后台生成一个5位数的短信验证码,并将该验证码通过短信平台发送到指定的手机号上。然后将该验证码和当前时间存储到VerificationCodeManager和TimeManager中。用户在5分钟内输入该验证码和注册信息时,我们可以通过调用isVerificationCodeValid()方法来验证该验证码是否正确和有效。如果验证码验证通过,将用户的注册信息写入数据库中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现短信验证码5分钟有效时间 - Python技术站