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可以改为其他值类似账号等

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

  • 相关阅读:
    怎么查看京东店铺的品牌ID
    PPT编辑的时候很卡,放映的时候不卡,咋回事?
    codevs 1702素数判定2
    codevs 2530大质数
    codevs 1488GangGang的烦恼
    codevs 2851 菜菜买气球
    hdu 5653 Bomber Man wants to bomb an Array
    poj 3661 Running
    poj 1651 Multiplication Puzzle
    hdu 2476 String Painter
  • 原文地址:https://www.cnblogs.com/yutf/p/13176847.html
Copyright © 2011-2022 走看看