java实现短信验证码5分钟有效时间

下面是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技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Python操作多维数组输出和矩阵运算示例

    Python是一门功能强大的编程语言,拥有许多强大的数学运算工具,其中最重要的便是多维数组和矩阵运算。这篇攻略将会讲解如何在Python中进行多维数组输出和矩阵运算,并提供两个示例说明。 多维数组输出 首先,让我们来看一下多维数组输出的方法。在Python中,可以使用numpy库来创建和操作多维数组。下面是一个简单的例子,展示了如何创建一个二维数组,并将其打…

    Java 2023年5月26日
    00
  • Java 8中的18个常用日期处理(收藏)

    Java 8中的18个常用日期处理(收藏) 介绍 Java 8以前的日期处理方式比较麻烦,Java 8引入了新的日期时间API,也称为JSR-310,使对日期和时间的处理更加简便。本文将介绍Java 8中的18个常用日期处理方法。 1. 获取当天的日期 LocalDate today = LocalDate.now(); 使用LocalDate.now()方…

    Java 2023年5月20日
    00
  • 浅析JDK和Tomcat的安装与配置方法

    浅析JDK和Tomcat的安装与配置方法 1. JDK的安装与配置 1.1 下载JDK JDK是Java Development Kit的简称,是Java开发所必须的环境。在安装JDK之前,需要先官网上下载JDK安装包。 示例1: 下载JDK 8.0 for Windows x64安装包 1.2 安装JDK 安装JDK的过程与一般软件的安装过程类似,运行安装…

    Java 2023年5月19日
    00
  • Spring boot 添加jsp支持配置详解

    下面是Spring Boot添加JSP支持的完整攻略: 1. 添加依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactI…

    Java 2023年6月15日
    00
  • Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    下面是 “Spring Boot 整合 Fisco Bcos的案例分析(区块链)” 的完整攻略。 什么是 Fisco Bcos Fisco Bcos 是由中国金融专家打造的一个区块链平台,具有高可用性、高扩展性和高安全性。 Spring Boot 整合 Fisco Bcos 步骤一:在本地安装 Fisco Bcos 在本地安装 Fisco Bcos,详细步骤…

    Java 2023年5月19日
    00
  • Java的Struts框架报错“ActionServletMappingException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionServletMappingException”错误。这个错误通常由以下原因之一起: ServletMapping配置错误:如果配置文件中没有正确ServletMapping,则可能会现此错误。在这种情况下,需要检查文件以解决此问题。 ServletMapping无效:如果ServletMappin…

    Java 2023年5月5日
    00
  • 通过实例解析POJO和JavaBean的区别

    首先,我们需要了解POJO和JavaBean的定义和区别。POJO(Plain Old Java Object)是一个简单的Java对象,它通常只包含了一些属性和其对应的getter/setter方法,没有实现任何接口,也不继承任何类。而JavaBean是一种特殊的POJO,它按照JavaBean的标准定义,需要包含空的构造方法、私有属性(通常使用priva…

    Java 2023年6月15日
    00
  • jar包手动添加到本地maven仓库的步骤详解

    这里将为您详细讲解手动将Jar包添加到本地Maven仓库的完整攻略。 1.准备工作: 在执行手动添加Jar包到Maven仓库之前,您需要准备以下工作: 将需要添加的Jar包下载到本地,或者确保本地已经存在该Jar包。 配置好Maven的环境变量。 获取该Jar包的版本号以及groupId和artifactId等相关信息。 2.手动添加Jar包到Maven仓库…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部