验证码生成,包含有效期

最近整理使用的一些工具类型,下面是在使用6位验证码的工具类型,包含过期时间,校验方法,

具体介绍

1使用场景 ——前端向后台请求验证码(图片验证码),然后后台根据前端输入验证码验证是否正确

代码

package com.*******.util.code;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 功能描述: <br>
 * 〈生成验证码工具类〉

 * @return:
 * @since: 1.0.0
 * @Author:
 * @Date:
 */
public class CodeUtil {//map集合用于保存验证码实体,建议使用ConcurrentHashMap 以避免删除时出现集合index出现非预期值报错
    private static Map<String, CodeEntity> codeMap = new ConcurrentHashMap<>();
    //过期时间
    private static final long expiredTime=1000*10*60;

    /**
     *生成验证码
      * @param codeEntity
     *@return String
     *@throws
     *@author yutf
     *@date 2020/5/23
     *
     */
    public static String createCode(CodeEntity codeEntity) {
    //生成六位验证码
        String code = String.valueOf(new Random().nextInt(899999) + 100000);
     //放入验证码 codeEntity.setCode(code);
//创建时间 codeEntity.setCreateTime(LocalDateTime.now()); //放入集合key——手机号 codeMap.put(codeEntity.getPhone(),codeEntity); return code; } //校验验证码 public static boolean verifyCode(CodeEntity codeEntity) { //清理验证码集合 cleanEmailMap(); //如果集合内存在符合条件的记录,key=传入的手机号 if(codeMap.containsKey(codeEntity.getPhone())){ System.out.println(codeMap.get(codeEntity.getPhone()).getCode()); System.out.println(codeEntity.getCode()); //如果集合内符合条件的的验证码与传入的验证码一直,则返回true if(codeMap.get(codeEntity.getPhone()).getCode().equals(codeEntity.getCode())){ return true; } } return false; } //清空超过有效期的验证码 public static void cleanEmailMap() { //如果集合不为空 if(!codeMap.isEmpty()){ //循环集合 for (Map.Entry<String, CodeEntity> codeEntry : codeMap.entrySet()) { //获取当前时间和创建时间的时间差 Duration duration = Duration.between(codeEntry.getValue().getCreateTime(), LocalDateTime.now()); //如果时间差大于有效时间—即当前时间-创建时间>有效时间,则验证码过期,从集合中删除 if(duration.toMillis() > expiredTime){ codeMap.remove(codeEntry.getKey()); } } } } public static void main(String[] args){ CodeEntity codeEntity = new CodeEntity(); codeEntity.setPhone("185******52");//手机号 //System.out.println("----生成验证码------:"+CodeUtil.createCode(codeEntity)); codeEntity.setPhone("18******652"); codeEntity.setCode("935995"); System.out.println("----校验验证码------:"+CodeUtil.verifyCode(codeEntity)); } }

实体类

package com.*******.util.code;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.time.LocalDateTime;

@Data   //单纯工具可以删除该注解
public class CodeEntity {
    @ApiModelProperty(value = "用户名/手机号",name ="phone")//swagger注解,单纯的工具,可去除该注解
    private String phone;
    @ApiModelProperty(value = "图片验证码/短信验证码",name ="code")
    private String code;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//不想前端返回,可删除该注解
    @ApiModelProperty(value = "验证码生成时间",name ="createTime")
    private LocalDateTime createTime;
}

实体类型中包含  手机号,验证码  ,时间     ,其中key可以改为其他值类似账号等

该方法适用范围并不广泛,只适用于单独的账号短信验证,因为短信验证或者邮箱验证都需要继承对应方法,后记篇文章会单独介绍

原文地址:https://www.cnblogs.com/yutf/p/13176847.html