简介
使用Java基本的逻辑和方法生成所需要的验证码,且生成的验证码包含大小写字母和数字,当然啦,也有纯数字的验证码。每一个方式都有详细的注释解析😆😆😆
第一种方式 Random 随机数类生成验证码
/**
* @version 1.0
* @ClassName LetterAndNumberRandom
* @Description 随机生成一个大写字母和小写字母,以及一个0到9之间的数字。
* @Author 南极
* @Date 2024/3/21 8:45
*/
public class LetterAndNumberRandom {
public static void main(String[] args) {
//控制验证码的长度
int lengthRandom = 5;
//定义一个StringBuffer减少字符串拼接的次数
StringBuilder randomCode = new StringBuilder();
//验证码多长循环多长
for (int i = 0; i < lengthRandom; i++) {
//大写字母范围的ASCII码
int upperLetter = (int) (Math.random() * (90 - 65 + 1) + 65);
//小写字母范围的ASCII码
int lowerLetter = (int) (Math.random() * (122 - 97 + 1) + 97);
//生成0到9之间的ASCII码
int number = (int) (Math.random() * (57 - 48 + 1) + 48);
//定义验证码的判断规则
int rand = (int) (Math.random() * 3);
//switch结构实现验证码的追加
switch (rand) {
case 0:
randomCode.append((char) upperLetter);
break;
case 1:
randomCode.append((char) lowerLetter);
break;
case 2:
randomCode.append((char) number);
break;
}
}
//将StringBuffer转换成String类型使用分割方法,获取5位验证码
String[] splitCode = randomCode.toString().split("");
//这种方式:Arrays.toString(splitCode) 或者for循环
System.out.print("获取五位随机数作为验证码(包括数字和字母大小写):");
//for循环或者上述方式
for (String s : splitCode) {
System.out.print(s + " ");
}
System.out.println();
for (int i = 0; i < splitCode.length; i++) {
//将字符串类型的数字下标i一个一个转换成char类型
char charCode = splitCode[i].charAt(0);
String str = "";
//判断验证码的类型
if (charCode >= 'A' && charCode <= 'Z') {
str = "字母大写";
} else if (charCode >= 'a' && charCode <= 'z') {
str = "字母小写";
} else {
str = "数字";
}
System.out.print("验证码第" + (i + 1) + "位是" + str + " ");
}
}
}
第一种方式,是在main方法中生成的验证码,想要获取最终结果的小伙伴,可以把最后的for循环删除,然后把里面的代码提取成一个方法哦😊😊😊
运行结果
第二种方式 洗牌算法实现验证码
import java.util.Random;
/**
* @version 1.0
* @ClassName VerificationCode验证码类
* @Description 随机5位数的验证码
* @Author 南极
* @Date 2024 - 04 - 19 - 8:28
*/
public class VerificationCode {
public static void main(String[] args) {
// 调用静态的5位数验证码的方法,获取一个5位数的验证码
String verifyCode = verificationCode(5);
// 打印验证码
System.out.println("您获取的验证码是:" + verifyCode);
// 判断每一个字符是否为数字或字母
printCaseOrNumber(verifyCode);
}
/**
* 随机生成包含大小写字母和数字的验证码
*
* @param length 验证码的长度
* @return 返回最后生成的验证码
*/
public static String verificationCode(int length) {
// 创建一个StringBuffer类用于保存验证码
StringBuilder strCode = new StringBuilder();
// 循环添加字母,26个小写字母,26个大写字母,10个数字
for (int i = 0; i < 62; i++) {
// 判断是否为小写字母
if (i < 26) {
strCode.append(((char) ('a' + i)));
} else if (i < 52) {
strCode.append(((char) ('A' + i - 26)));
} else {
strCode.append((i - 52));
}
}
// 获取字符串长度
int strLength = strCode.length();
//确保验证码的长度在62位之内
if (length > strLength) {
throw new RuntimeException("验证码的长度不能超过62位");
}
// 创建随机类对象
Random r = new Random();
// 使用洗牌算法的逻辑,打乱StringBuilder对象
for (int i = 0; i < strLength; i++) {
// 获取随机索引
int tempIndex = r.nextInt(strCode.length());
// 交换的中间变量
char temp = strCode.charAt(tempIndex);
// 设置随机变量值为下标 i 的值
strCode.setCharAt(tempIndex, strCode.charAt(i));
// 那么下标 i 的值就等于随机下标的值
strCode.setCharAt(i, temp);
}
return strCode.substring(0, length);
}
/**
* 判断验证码是否为数字或字母
*
* @param str 传入的字符串
*/
public static void printCaseOrNumber(String str) {
// 把传入的字符串每一个都拆分成一个char类型数组的元素
char[] charArray = str.toCharArray();
// 判断每一个元素是否为数字或字母
for (int i = 0; i < charArray.length; i++) {
char ch = charArray[i];
if (ch >= 65 && ch <= 91) {
System.out.print("第" + (i + 1) + "个数字是大写字母");
} else if (ch >= 97 && ch <= 122) {
System.out.print("第" + (i + 1) + "个数字是小写字母");
} else {
System.out.print("第" + (i + 1) + "个数字是数字");
}
System.out.print("\t\t");
}
}
}
这种方式实现的验证码很新奇,基本是不常见的验证码,会发现他生成的验证码出奇的乱,很少见😁😁😁
运行结果
第三种方式 我称之为简单方式哦
import java.util.Random;
/**
* @version 1.0
* @ClassName SimplenessCode
* @Description 简单方式生成验证码
* @Author NanJi
* @Date 2024/8/9 - 8:51
*/
public class Captcha {public static void main(String[] args) {
// 验证码的长度,后续要获取多长的验证码只需要修改一下这个变量值即可
int length = 5;
String code = getCode(length);
System.out.println(code);
}
/**
* 获取包含大小写字母和数字的验证码,长度无限制
*
* @param length 验证码的长度,长度小于 1 返回 null
* @return 返回验证码
*/
public static String getCode(int length) {
if (length < 1) {
System.out.println("验证码长度小于 1");
return null;
}
// 创建随机数生成器对象
Random r = new Random();
// 创建StringBuilder对象高效存储字符串
StringBuilder sb = new StringBuilder();
// 定义一个要随机的验证码字符串
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
// 循环多少次,生成多长的验证码
for (int i = 0; i < length; i++) {
// 获取随机数
int index = r.nextInt(str.length());
// 获取随机字符
char c = str.charAt(index);
// 将随机字符添加到StringBuilder对象中
sb.append(c);
}
// 打印验证码,这里可以直接输出StringBuilder对象是因为他默认调用了toString()方法
//System.out.println(sb);
//返回生成的验证码
return sb.toString();
}
}
这是非常简单的一个方式啦,其他的方式看不懂的小伙伴,就可以使用这个哈🤗🤗🤗
运行结果
第四种方式 纯数字验证码
/**
* @version 1.0
* @ClassName NumberCode
* @Description 生成存数字的验证码
* @Author NanJi
* @Date 2024/8/9 - 9:06
*/
public class NumberCode {
public static void main(String[] args) {
System.out.println(numberCode(5));
}
/**
* 生成指定长度的数字验证码
*
* @param length 验证码的长度
* @return 返回生成的验证码
*/
private static String numberCode(int length) {
// 这里可以看到生成的随机数是什么样子的
double r = Math.random();
System.out.println(r);
// 加上一个""双引号是为了让数字和字符串拼接成新的字符串,这样子就可以截取数字了
return (r + "").substring(2, 2 + length);
}
}
这个方式可以生成一个纯数字的验证码,而且效率非常快,美中不足的是,它只能16位,但是也够用了,一般验证码用不到那么长🤔🤔🤔
运行结果
第五种方式 纯数字验证码,可以很长
/**
* @version 1.0
* @ClassName NumberCode
* @Description 生成存数字的验证码
* @Author NanJi
* @Date 2024/8/9 - 9:06
*/
public class NumberCode {
public static void main(String[] args) {
//获取验证码
String code = getCode(500);
System.out.println("纯数字验证码:" + code);
}
/**
* 获取纯数字验证码,长度小于 1 位返回 null 值
*
* @param length 验证码的长度
* @return 返回验证码
*/
public static String getCode(int length) {
//如果验证码长度小于 1 位返回 null
if (length <= 1) {
System.out.println("验证码长度不能小于1位");
return null;
}
//创建StringBuilder高效处理字符串,默认初始化验证码长度的容量
StringBuilder sCode = new StringBuilder(length);
//定义Random类生成随机数
Random r = new Random();
//循环添加验证码
for (int i = 1; i <= length; i++) {
//获取0-9的随机数
int number = r.nextInt(10);
sCode.append(number);
}
return sCode.toString();
}
}
运行结果
这里我生成了一个500位的,要生成其他数字可以给getCode方法传入指定的数值
小结:
上述的几种方法,都脱离不了随机数,有用到switch结构,洗牌算法,通过索引追加的方式,获取到最终结果,大家有其他更好的方式也欢迎评论区一起探讨哦🤔🤔🤔
欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生👊👊👊