我在下面的代码中做了一个简单的密码(哈希)检查功能。但我遇到了一个问题,代码似乎只适用于文件中的单行数据,检查适用于Line1但不适用于Line2,我不确定是什么问题。数据如下所示
结果应该是hashedP匹配Line1或2.但它最终只匹配Line1
260670134225f2a24b59121739fec73584b0ddb6b49c39e31bd1df5483ac144d //Line1
cf80cd8aed482d5d1527d7dc72fceff84e6326592848447d2dc0b0e87dfc9a90 //Line2
代码:
public static void LoginMenu() {
System.out.println("Please Enter Your Password: ");
Scanner UserPass = new Scanner(System.in);
String UserP = UserPass.nextLine();
String hashedP = Utility.getHash(UserP);
File file = new File("admin.dat");
try {
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String fileline = scanner.nextLine();
if (!(fileline.equals(hashedP))) {
System.out.println("Login Failed!");
LoginMenu();
}
else {
System.out.println("Login Successful.\n");
AdminMenu();
}
}
scanner.close();
}
catch (FileNotFoundException exc) {
exc.printStackTrace();
}
}
答案 0 :(得分:2)
让我们分析一下这个部分:
while (scanner.hasNextLine()) {
String fileline = scanner.nextLine();
if (!(fileline.equals(hashedP))) {
System.out.println("Login Failed!");
LoginMenu();
}
else {
System.out.println("Login Successful.\n");
AdminMenu();
}
}
while
循环。hashedP
进行检查
3.1。如果匹配,我们会显示管理界面
3.2。如果不匹配,我们会提示用户再次登录。你甚至没有到达文件中的第二行,它失败得太快 你应该重构你的循环以更加努力:
boolean failed = true;
while (scanner.hasNextLine())
{
String fileline = scanner.nextLine();
if (fileline.equals(hashedP))
{
failed = false;
System.out.println("Login Successful.\n");
AdminMenu();
}
}
if(failed)
{
System.out.println("Login Failed!");
LoginMenu();
}
与此无关,如果以任何方式可以避免,那么永远不会以递归方式调用函数。
在这种情况下,例如,admin.dat
和新的stdin
扫描仪将在输入错误密码时打开多次,设计不当。
我建议使用while(true)
循环来读取密码并在此之前执行其他所有操作:
public static void LoginMenu()
{
ArrayList<String> hashes = new ArrayList<String>();
File file = new File("admin.dat");
try
{
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine())
{
hashes.add(scanner.nextLine());
}
scanner.close();
}
catch (FileNotFoundException exc)
{
exc.printStackTrace();
return;
}
Scanner UserPass = new Scanner(System.in);
while (true)
{
System.out.println("Please Enter Your Password: ");
String UserP = UserPass.nextLine();
String hashedP = Utility.getHash(UserP);
if (hashes.contains(hashedP))
{
System.out.println("Login Successful.\n");
AdminMenu();
break;
}
System.out.println("Login Failed!");
}
}