Java實(shí)現(xiàn)通過時間獲取8位驗(yàn)證碼
1.需求
要求是很簡單的,每個驗(yàn)證碼的有效時間是2小時,這個并不是收到驗(yàn)證碼開始計(jì)時的,而是每個兩小時的時間段使用的是相同的驗(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ù)處理方法
將2個小時處理為相同的值:
@Slf4j
public class VerificationCodeUtil {
/**
* 時間字符串
*
* @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 {
// 對指定字符串生成驗(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é)
很簡單的算法分享。優(yōu)點(diǎn):
- 不需要將生成的驗(yàn)證碼緩存。
- 時間入?yún)ⅲ軌蛑貜?fù)獲取相同的值。
以上就是Java實(shí)現(xiàn)通過時間獲取8位驗(yàn)證碼的詳細(xì)內(nèi)容,更多關(guān)于Java獲取驗(yàn)證碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java簡單數(shù)據(jù)加密方法DES實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java簡單數(shù)據(jù)加密方法DES實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
SpringBoot項(xiàng)目中改變web服務(wù)的路徑的兩種方案
這篇文章主要介紹了SpringBoot項(xiàng)目中改變web服務(wù)的路徑的兩種方案,通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08
Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn)
這篇文章主要介紹了Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
java中@EnableAutoConfiguration注解使用
在Spring Boot框架中,@EnableAutoConfiguration是一種非常重要的注解,本文就來介紹一下java中@EnableAutoConfiguration注解使用,感興趣的可以了解一下2023-11-11

