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

yizhihongxing

下面是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日

相关文章

  • Java编程用指定字符打印菱形实例

    对于Java编程打印指定字符的菱形实例,具体操作步骤如下: 1. 确定框架和输出样式 菱形实例通常分为两部分,上半部分和下半部分。我们可以先确定输出框架,可以用一个二维字符数组来表示,其中每个元素存储一个字符,通常用空格或特定字符填充。 上半部分可以采用两个嵌套的循环控制每行的输出符号,下半部分则可以采用逆向输出的方法,即先确定下边界,再循环输出。 2. 确…

    Java 2023年5月23日
    00
  • 基于SpringMVC实现网页登录拦截

    基于SpringMVC实现网页登录拦截 本文将详细讲解如何使用SpringMVC实现网页登录拦截,并提供两个示例说明。 环境准备 在开始实现网页登录拦截之前,我们需要准备以下环境: JDK 18或以上版本 Maven 3.6.3或以上版本 Tomcat 9.0或以上版本 实现步骤 下面是实现网页登录拦截的详细步骤: 步骤一:创建Maven项目 首先,我们需要…

    Java 2023年5月17日
    00
  • java实现模仿斗地主发牌

    讲解“Java实现模仿斗地主发牌”的完整攻略,可以分为以下几个步骤: 1. 创建扑克牌对象 为了模仿斗地主发牌,我们需要先创建一副扑克牌的对象。扑克牌通常包含四种花色:方块、梅花、红桃、黑桃;每种花色又有十三种不同的点数,即从 A 到 K 共 13 种。 创建一个 Card 类来表示一张扑克牌,包含属性 suit(花色)和 rank(点数),以及 toStr…

    Java 2023年5月23日
    00
  • 常见的垃圾回收器有哪些?

    以下是关于常见的垃圾回收器的完整使用攻略: 常见的垃圾回收器 垃圾回收器是一种自动化的内存管理方式,可以减少程序员的作量,提高程序的可靠和安全性。常见的垃圾回收器有以下几种: 1. 标记清除算法 标记清除算法是垃圾回收的一种常见算法,它的原理是在程序运行过程中,标记所有不再使用的内存空间,然后清除这些内存空间,从而回收内存空间。 以下是一个 Java 中标记…

    Java 2023年5月12日
    00
  • 解决springboot 获取form-data里的file文件的问题

    关于“解决springboot 获取form-data里的file文件的问题”的攻略,我们可以分为以下几个步骤来讲解: 添加相关依赖 在使用Spring Boot的过程中需要引入一些相关依赖,我在这里推荐使用spring-boot-starter-web模块,并且添加spring-boot-starter-tomcat或者spring-boot-starte…

    Java 2023年5月20日
    00
  • mybatis查询返回Map类型的讲解

    Mybatis是一个优秀的ORM框架,常见的查询结果是将数据封装在POJO类中,但有时我们还需要查询结果封装到Map类型中,本文将详细讲解如何使用mybatis查询返回Map类型的方法。 1. 返回Map类型的Mapper接口方法 我们可以定义一个返回Map类型的Mapper接口方法,具体过程如下: 1.1 定义Mapper接口 public interfa…

    Java 2023年5月20日
    00
  • 探究JavaScript函数式编程的乐趣

    探究JavaScript函数式编程的乐趣 函数式编程是一种以函数为基础,将计算看作数学函数的风格。这种编程方式通常被指定为声明式编程,因为它主要使用函数声明来刻画程序结果。本文将介绍JavaScript中的函数式编程的乐趣,并引入两个示例以解释其用途。 什么是函数式编程? 函数式编程是一种流行的JavaScript编程范式。它的目标是使用函数来处理数据,而不…

    Java 2023年5月26日
    00
  • 详解netty中常用的xml编码解码器

    为了讲解“详解netty中常用的xml编码解码器”的完整攻略,我们需要以下内容: XML 的基础知识和常见的 XML 接口介绍 Netty 中 XML 编码解码器的实现方式 在 Netty 中实现 XML 编码解码器的示例 下面我们就来一步一步地讲解。 1. XML 的基础知识和常见的 XML 接口介绍 XML 是一种常见的标记语言,用于描述各种各样的数据和…

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