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日

相关文章

  • Java实现读写文件功能的代码分享

    下面是Java实现读写文件功能的完整攻略。 读文件 读文件是指从磁盘上读取文件内容到内存中。Java实现读文件可以使用InputStream、InputStreamReader、BufferedReader等类。 InputStream InputStream是Java的基本输入流,用于从源(如文件)读取字节的流。可以使用 FileInputStream 类…

    Java 2023年5月19日
    00
  • 对象的创建过程包括哪些步骤?

    以下是关于“对象的创建过程包括哪些步骤?”的完整使用攻略: 1. 对象的创建过程 在Java中,对象的创建过程包括以下几个步骤: 类加载:在Java程序运行,JVM会将类的字节码加载到内存中,并对类进行解析和验证。 分配内存:在类加载完成后,VM会在堆内存中为对象配一块连续的内存空间。在分配内存时,JVM会根据对象的大小和内存分配策略来确定内存分配方式。 初…

    Java 2023年5月12日
    00
  • ColdFusionMX 编程指南 ColdFusionMX编程入门

    首先,需要明确“ColdFusionMX 编程指南 ColdFusionMX编程入门”是一本有关ColdFusionMX编程的入门书籍,其中包含了关于ColdFusion应用程序、变量、函数和流程控制等方面的基本知识和实例,适合初学者阅读学习。 一、阅读方式 1.阅读顺序:建议按照书本的章节顺序阅读,因为每个章节的内容都是有关联的。 2.实践方法:书中的实例…

    Java 2023年6月15日
    00
  • Spring Boot2开发之Spring Boot整合Shiro两种详细方法

    SpringBoot2开发之SpringBoot整合Shiro两种详细方法 Shiro是一个强大且易于使用的Java安全框架,可以提供身份验证、授权、加密和会话管理等功能。本文将详细讲解如何在Spring Boot应用程序中整合Shiro,包括两种详细方法。 方法一:使用Shiro Spring Boot Starter Shiro Spring Boot …

    Java 2023年5月15日
    00
  • JDBC 数据库常用连接 链接字符串

    当我们使用Java来操作数据库时,需要使用到JDBC API。而在使用JDBC API时,我们需要对数据库进行连接,与数据库建立起联系,这个过程称为“连接(Connect)”。 连接包括几个关键步骤: 1.导入JDBC相关的Jar包 我们需要导入JDBC相关的Jar包才能够使用JDBC API。常用的Jar包有mysql-connector-java,它是M…

    Java 2023年6月16日
    00
  • SpringBoot入门实现第一个SpringBoot项目

    首先,我们需要进行一些准备工作: 安装JDK,并配置好环境变量。 安装Maven,并配置好环境变量。 安装IDEA或者其他Java开发工具。 接下来,按照以下步骤来进行SpringBoot入门实现第一个SpringBoot项目。 1. 创建一个SpringBoot项目 我们可以通过使用Spring Initializr来创建一个SpringBoot项目,步骤…

    Java 2023年5月15日
    00
  • 关于Java如何正确地实现方法重载详解

    关于Java如何正确地实现方法重载详解 什么是方法重载? 方法重载(Method Overloading)指的是在一个类中定义多个同名方法,但它们的形式参数列表不同。 方法重载的目的是为了让同名方法能够接收不同类型或者不同数量的参数而有不同的行为,实现更加灵活和通用的功能。 什么条件下才能进行方法重载? 方法名称相同; 参数个数或者类型不同; 方法返回值可以…

    Java 2023年5月19日
    00
  • ssm整合shiro使用详解

    关于“ssm整合shiro使用详解”的完整攻略,我整理了以下内容: 1. 集成SSM框架 首先,我们需要集成SSM框架。SSM框架是Spring+SpringMVC+Mybatis三个框架的集成。具体步骤如下: 1.1. 搭建Spring环境 引入Spring的maven依赖: <dependency> <groupId>org.sp…

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