Java實(shí)現(xiàn)通過時(shí)間獲取8位驗(yàn)證碼
1.需求
要求是很簡(jiǎn)單的,每個(gè)驗(yàn)證碼的有效時(shí)間是2小時(shí),這個(gè)并不是收到驗(yàn)證碼開始計(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)通過時(shí)間獲取8位驗(yàn)證碼的詳細(xì)內(nèi)容,更多關(guān)于Java獲取驗(yàn)證碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java全面細(xì)致講解Cookie與Session及kaptcha驗(yàn)證碼的使用
web開發(fā)階段我們主要是瀏覽器和服務(wù)器之間來進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對(duì)于機(jī)器來說,在一次請(qǐng)求之間只是會(huì)攜帶著本次請(qǐng)求的數(shù)據(jù)的,但是可能多次請(qǐng)求之間是會(huì)有聯(lián)系的,所以提供了會(huì)話機(jī)制2022-06-06
ElasticSearch學(xué)習(xí)之Es索引Api操作
這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之Es索引Api操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
SpringCloud使用Ribbon實(shí)現(xiàn)負(fù)載均衡的流程步驟
在微服務(wù)架構(gòu)中,負(fù)載均衡是一項(xiàng)關(guān)鍵的技術(shù),它可以確保各個(gè)服務(wù)節(jié)點(diǎn)間的負(fù)載分布均勻,提高整個(gè)系統(tǒng)的穩(wěn)定性和性能,Spring Cloud 中的 Ribbon 就是一種負(fù)載均衡的解決方案,本文將深入探討 Ribbon 的原理和在微服務(wù)中的應(yīng)用,需要的朋友可以參考下2024-02-02
解決Java?API不能遠(yuǎn)程訪問HBase的問題
這篇文章主要介紹了解決Java?API不能遠(yuǎn)程訪問HBase的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringMvc切換Json轉(zhuǎn)換工具的操作代碼
SpringBoot切換使用goolge的Gson作為SpringMvc的Json轉(zhuǎn)換工具,本文給大家講解SpringMvc切換Json轉(zhuǎn)換工具的操作代碼,感興趣的朋友一起看看吧2024-02-02
idea debug沒有force step into的問題解決
本文主要介紹了IDEA Debug中ForceStepInto按鈕消失的問題及解決方法,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案
我們?cè)陧?xiàng)目中經(jīng)常碰到需要讀取固定文件的場(chǎng)景,如模板文件,一般做法是將文件放在resources目錄下,程序通過多種方式可以順利讀取文件,這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的相關(guān)資料,需要的朋友可以參考下2024-07-07

