Java實(shí)現(xiàn)通過(guò)時(shí)間獲取8位驗(yàn)證碼
1.需求
要求是很簡(jiǎn)單的,每個(gè)驗(yàn)證碼的有效時(shí)間是2小時(shí)
,這個(gè)并不是收到驗(yàn)證碼開(kāi)始計(jì)時(shí)的,而是每個(gè)兩小時(shí)的時(shí)間段使用的是相同的驗(yàn)證碼。
2.代碼實(shí)現(xiàn)
2.1 依賴
<dependency> <groupId>gov.nist.math</groupId> <artifactId>jama</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.6</version> </dependency>
2.2 時(shí)間參數(shù)處理方法
將2個(gè)小時(shí)處理為相同的值:
@Slf4j public class VerificationCodeUtil { /** * 時(shí)間字符串 * * @param dateStr yyyy-MM-dd HH:mm:ss */ public static String getCode(String dateStr) { int dataStrLength = 13; try { if (dateStr.length() >= dataStrLength) { String yearMonthDay = dateStr.substring(0, 10); int hour = Integer.parseInt(dateStr.substring(11, 13)); int twoHour = 2; if (hour % twoHour != 0) { hour--; } String md5Str = DigestUtils.md5Hex("vc#" + yearMonthDay + hour); return getCodeByMd5(md5Str); } else { log.error("dateStr [{}] not match format [yyyy-MM-dd HH:mm:ss]!", dateStr); } } catch (Exception e) { e.printStackTrace(); log.error("dateStr [{}] not match format [yyyy-MM-dd HH:mm:ss]!", dateStr); } return dateStr; } }
2.3 截取驗(yàn)證碼方法
@Slf4j public class VerificationCodeUtil { // 對(duì)指定字符串生成驗(yàn)證碼 private static String getCodeByMd5(String md5Str) { try { byte[] md5 = md5Str.getBytes(); double[][] preMatrix = new double[4][8]; for (int j = 0; j < 4; j++) { for (int k = 0; k < 8; k++) { preMatrix[j][k] = md5[j * 8 + k]; } } Matrix matrix = new Matrix(preMatrix); Matrix matrix1 = matrix.getMatrix(1, 2, 2, 5); Matrix matrix2 = matrix.transpose(); Matrix matrix21 = matrix2.getMatrix(0, 3, 0, 3); Matrix matrix22 = matrix2.getMatrix(4, 7, 0, 3); Matrix matrix3 = matrix21.plus(matrix22); Matrix result = matrix1.times(matrix3); double[][] re = result.getArray(); StringBuilder str = new StringBuilder(); for (double[] doubles : re) { for (double aDouble : doubles) { int a = (int) aDouble % 16; str.append(Integer.toHexString(a)); } } return str.toString().toUpperCase(); } catch (Exception e) { e.printStackTrace(); return null; } } }
2.4 驗(yàn)證方法
@Slf4j public class VerificationCodeUtil { public static void main(String[] args) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); DateTime parse = DateUtil.parse("2023-11-09 23:59:59", "yyyy-MM-dd HH:mm:ss"); String format = df.format(parse); System.out.println(getCode(format)); // 00:00 3A756DFC // 00:59 3A756DFC // 01:59 3A756DFC // 01:59 3A756DFC // 02:00 9E937D4B // 02:59 9E937D4B // 03:00 9E937D4B // 22:00 D014DD79 // 23:59 D014DD79 } }
3.總結(jié)
很簡(jiǎn)單的算法分享。優(yōu)點(diǎn):
- 不需要將生成的驗(yàn)證碼緩存。
- 時(shí)間入?yún)ⅲ軌蛑貜?fù)獲取相同的值。
以上就是Java實(shí)現(xiàn)通過(guò)時(shí)間獲取8位驗(yàn)證碼的詳細(xì)內(nèi)容,更多關(guān)于Java獲取驗(yàn)證碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java簡(jiǎn)單數(shù)據(jù)加密方法DES實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Java簡(jiǎn)單數(shù)據(jù)加密方法DES實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot項(xiàng)目中改變web服務(wù)的路徑的兩種方案
這篇文章主要介紹了SpringBoot項(xiàng)目中改變web服務(wù)的路徑的兩種方案,通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn)
這篇文章主要介紹了Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03java中@EnableAutoConfiguration注解使用
在Spring Boot框架中,@EnableAutoConfiguration是一種非常重要的注解,本文就來(lái)介紹一下java中@EnableAutoConfiguration注解使用,感興趣的可以了解一下2023-11-11