Java使用简单循环实现OTP验证及失效跳转else问题排查
问题原因分析
- OTP生成逻辑错误:你每次调用
oTp(8)方法都会生成全新的随机OTP,注册阶段展示给用户的OTP和验证阶段调用oTp(8)生成的OTP完全不一致,自然不可能匹配成功。 - 数组比较逻辑错误:Java中char数组的
equals()方法继承自Object类,对比的是数组的内存地址而非内容,哪怕两个数组存储的字符完全相同,只要是不同的数组对象,equals()返回的就是false。 - 循环条件逻辑错误:do-while的判断条件写的是
isPasswordCorrect=false,这是赋值操作而非等值判断,会永远把变量设为false,导致即便验证通过也无法跳出循环。
修复方案
- 首先在
NewRegandLogin类中新增成员变量,用于存储注册阶段生成的OTP:
// 新增成员变量 private char[] generatedOtp; // 配套getter、setter public char[] getGeneratedOtp() { return generatedOtp; } public void setGeneratedOtp(char[] generatedOtp) { this.generatedOtp = generatedOtp; }
- 修改主类中生成展示OTP的逻辑,生成后先存储再打印:
// 替换原有System.out.println(newRegAndLogin.oTp(8));的代码 char[] otp = newRegAndLogin.oTp(8); newRegAndLogin.setGeneratedOtp(otp); System.out.println(otp);
- 修正OTP验证逻辑,导入
java.util.Arrays工具类,用Arrays.equals()对比数组内容,同时不要重新生成OTP,直接和存储的generatedOtp对比:
void oTpVerification() { isPasswordCorrect = false; // 替换原有if判断逻辑 if (Arrays.equals(oTpFromImput, generatedOtp)) { isPasswordCorrect = true; System.out.println("Logging In....."); }else { System.out.println("Incorrect password.\nPlease enter valid password: 8 alpha numeric characters(Aa,123,@,#,$,%)"); } }
- 修正do-while循环的判断条件:
// 替换原有while (isPasswordCorrect=false) } while (!isPasswordCorrect);
额外优化建议
- 你在主方法中重复两次执行了
loginInformation.add(newRegAndLogin),会导致列表中存在两个完全一样的对象,删除其中一次即可。 - OTP是敏感信息,验证通过后可以调用
Arrays.fill(generatedOtp, (char)0)清空数组内容,降低信息泄露风险。
内容的提问来源于stack exchange,提问作者Geri Glazer
相关产品推荐
相关产品推荐

