最近整理使用的一些工具型別,下面是在使用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.uj5u.com/houduan/158869.html
標籤:Java
上一篇:etcd — 安裝部署
