Java实现通过时间获取8位验证码
更新时间:2023年11月10日 10:05:23 作者:シ風箏
这篇文章主要为大家详细介绍了Java如何通过时间获取8位验证码(每两个小时生成一个),文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
1.需求
要求是很简单的,每个验证码的有效时间是2小时,这个并不是收到验证码开始计时的,而是每个两小时的时间段使用的是相同的验证码。
2.代码实现
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 时间参数处理方法
将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 截取验证码方法
@Slf4j
public class VerificationCodeUtil {
// 对指定字符串生成验证码
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 验证方法
@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.总结
很简单的算法分享。优点:
- 不需要将生成的验证码缓存。
- 时间入参,能够重复获取相同的值。
以上就是Java实现通过时间获取8位验证码的详细内容,更多关于Java获取验证码的资料请关注脚本之家其它相关文章!
相关文章
Java全面细致讲解Cookie与Session及kaptcha验证码的使用
web开发阶段我们主要是浏览器和服务器之间来进行交互。浏览器和服务器之间的交互就像人和人之间进行交流一样,但是对于机器来说,在一次请求之间只是会携带着本次请求的数据的,但是可能多次请求之间是会有联系的,所以提供了会话机制2022-06-06
SpringCloud使用Ribbon实现负载均衡的流程步骤
在微服务架构中,负载均衡是一项关键的技术,它可以确保各个服务节点间的负载分布均匀,提高整个系统的稳定性和性能,Spring Cloud 中的 Ribbon 就是一种负载均衡的解决方案,本文将深入探讨 Ribbon 的原理和在微服务中的应用,需要的朋友可以参考下2024-02-02
idea debug没有force step into的问题解决
本文主要介绍了IDEA Debug中ForceStepInto按钮消失的问题及解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-10-10
Spring Boot项目获取resources目录下文件并返回给前端的方案
我们在项目中经常碰到需要读取固定文件的场景,如模板文件,一般做法是将文件放在resources目录下,程序通过多种方式可以顺利读取文件,这篇文章主要给大家介绍了关于Spring Boot项目获取resources目录下文件并返回给前端的相关资料,需要的朋友可以参考下2024-07-07


最新评论