最近整理使用的一些工具类型,下面是在使用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可以改为其他值类似账号等
该方法适用范围并不广泛,只适用于单独的账号短信验证,因为短信验证或者邮箱验证都需要继承对应方法,后记篇文章会单独介绍
来源:oschina
链接:https://my.oschina.net/u/4297117/blog/4320177