zoukankan      html  css  js  c++  java
  • 验证码生成,包含有效期

    最近整理使用的一些工具类型,下面是在使用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可以改为其他值类似账号等

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

  • 相关阅读:
    LeetCode Reverse Integer
    LeetCode 3Sum Closest
    LeetCode Remove Duplicates from Sorted Array
    解决git 远程删除分支之后,vscode本地分支列表没有更新问题
    reduce, filter, map, forEach 使用
    ehcarts tooltip 自定义展示. 展示小图例
    vscode插件,代码块,快捷键 入门
    DorisSQL与MySQL函数对照 差异篇
    Doris与mysql语法对照,差异篇
    功能测试报告模板
  • 原文地址:https://www.cnblogs.com/yutf/p/13176847.html
Copyright © 2011-2022 走看看