验证码生成,包含有效期

最近整理使用的一些工具类型,下面是在使用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;

/**
 * 功能描述: 
* 〈生成验证码工具类〉 *
@return: * @since: 1.0.0 * @Author: * @Date: */ public class CodeUtil {//map集合用于保存验证码实体,建议使用ConcurrentHashMap 以避免删除时出现集合index出现非预期值报错 private static Map 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 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可以改为其他值类似账号等

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

你可能感兴趣的:(验证码生成,包含有效期)