题目
在登录注册页面中,除了用户名和密码外,通常也会包含验证码。验证码是用来区分用户是计算机还是人,防止恶意破解密码、刷票、灌水等行为。在判断验证码时一般不区分大小写。请编写程序模拟验证码的判断过程,如果输入正确,给出提示,结束程序。如果输入错误,给出提示,验证码刷新,重新输入,直至正确为止。
生成4位随机验证码的功能在之前的题目中已经完成,可以直接使用。《定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。》
运行效果如下:
生成的验证码为:BkhD
请输入验证码
abcd
输入错误,请重新输入...
生成的验证码为:n1wX
请输入验证码
aaaa
输入错误,请重新输入...
生成的验证码为:Fm1a
请输入验证码
fm1a
输入正确
我的代码实现
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
loop:
while (true) {
String method = method();
System.out.println("生成的验证码为:" + method);
System.out.println("请输入验证码");
String code = scanner.next();
Boolean aBoolean = checkCode(code);
if (aBoolean == true) {
System.out.println("输入正确");
break loop;
} else {
System.out.println("输入错误,请重新输入...");
}
}
}
public static String method() {
StringBuilder stringBuilder = new StringBuilder();
for (char i = 'a'; i <= 'z'; i++) {
stringBuilder.append(i);
}
for (char i = 'A'; i <= 'Z'; i++) {
stringBuilder.append(i);
}
for (char i = '0'; i <= '9'; i++) {
stringBuilder.append(i);
}
Random random = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
int i1 = random.nextInt(stringBuilder.length());
code += stringBuilder.charAt(i1);
}
return code;
}
public static Boolean checkCode(String code) {
String realCode = method();
if (realCode.equalsIgnoreCase(code)) {
return true;
} else {
return false;
}
}
}
我的运行效果
生成的验证码为:dbjt
请输入验证码
dbjt
输入错误,请重新输入...
生成的验证码为:vdiA
请输入验证码
cdia
输入错误,请重新输入...
生成的验证码为:tI7K
请输入验证码
原因分析
看到我们定义的检查验证码是否正确的方法checkCode()
public static Boolean checkCode(String code) {
String realCode = method();
if (realCode.equalsIgnoreCase(code)) {
return true;
} else {
return false;
}
}
分析:if判断语句中**realCode.equalsIgnoreCase(code)**它返回的本身就是一个布尔值,我这个判断很多此一举,然后我就改代码,寻思着这次总该对了吧
修改的代码:
public static Boolean checkCode(String code) {
String realCode = method();
return realCode.equalsIgnoreCase(code);
}
修改后的运行结果
生成的验证码为:5ztk
请输入验证码
5ztk
输入错误,请重新输入...
生成的验证码为:nuUy
请输入验证码
nuuy
输入错误,请重新输入...
生成的验证码为:5921
请输入验证码
5921
输入错误,请重新输入...
生成的验证码为:JqwG
请输入验证码
接着分析
为什么改了还是不对呢?
原来是我在主方法中调用了method方法生成了一个验证码,之后我又在checkCode方法中又再次调用了method方法,这样我就调用了两次,拿新生成的验证码和我们输入的验证码相比怎么可能成功呢?
正确的代码
package com.wedu.test.test2;
import java.util.Random;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
loop:while (true) {
String realCode = method();
System.out.println("生成的验证码为:" + realCode);
System.out.println("请输入验证码");
String code = scanner.next();
Boolean aBoolean = checkCode(realCode,code);
if (aBoolean == true) {
System.out.println("输入正确");
break loop;
} else {
System.out.println("输入错误,请重新输入...");
}
}
}
public static String method() {
StringBuilder stringBuilder = new StringBuilder();
for (char i = 'a'; i <= 'z'; i++) {
stringBuilder.append(i);
}
for (char i = 'A'; i <= 'Z'; i++) {
stringBuilder.append(i);
}
for (char i = '0'; i <= '9'; i++) {
stringBuilder.append(i);
}
Random random = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
int i1 = random.nextInt(stringBuilder.length());
code += stringBuilder.charAt(i1);
}
return code;
}
public static Boolean checkCode(String realCode,String code) {
return realCode.equalsIgnoreCase(code);
}
}
运行结果
生成的验证码为:U7Mk
请输入验证码
u7mk
输入正确
修改思路:
根据我们上面分析的原因,我们首先修改检查验证码的代码(也就是checkCode),既然我们不能重新调用method方法,那么我们怎么才能拿到主方法中调用method生成的验证码呢,解决办法就是定义检查验证码的方法时形参改成要检查验证码和我们输入的验证码,为了方便理解我把主方法中的代码稍做了修改,大家自己看~
最后我想说写代码一定要注重逻辑,要会自己思考,不要一碰到不会的题目就上网查,作为一名初学者多学多练真的很重要,光看不练等于白看,多练也能加深多知识点的理解,加油吧~