java - java中调试密码验证代码

标签 java

我一直在尝试使用 java 创建密码验证。密码验证的要求应为:

1) 密码长度应至少为六个字符。

2)密码至少包含一个大写和小写字母。

3) 密码应至少为一位数字。

我已经完成了 1 和 2,但我无法找出数字 3。

我制作了一个 boolean 方法来检查字符是否包含数字。据说,如果它能够找到一个数字,它会返回 true,但即使我输入了带有数字的密码,它仍然返回 false。

我想知道我的代码出了什么问题。希望你们能帮我解决这个问题。

package PasswordVerifier;
import java.util.Scanner;
public class PasswordVerifierMain {

public static void main(String[]args){
    Scanner hold = new Scanner(System.in);
    String pass;
    System.out.print("Enter password:");
    pass = hold.nextLine();

    if(isValid(pass) && pass.length() >= 6){

        boolean hasUppercase = pass.equals(pass.toUpperCase());
        boolean hasLowercase = pass.equals(pass.toLowerCase());
        if(!hasUppercase){
            System.out.print("Must have atleast one uppercase letter!");
        }else if(!hasLowercase){
            System.out.print("Must have atleast one lowercase letter!");
        }else{
            System.out.print("Password Successful!");
        }

    }else{
        System.out.print("Invalid Password! Minimum six characters!");
    }

    System.out.println();
    System.out.println(isValid(pass));
}

private static boolean isValid(String pass){
    boolean status = true;
    int i = 0;
    while(status && i < pass.length()){
        if(!Character.isDigit(pass.charAt(i))){
            status = false;
        }
        i++;
    }

    return status;
}

}

最佳答案

您可以在每次迭代中设置状态,从而有效地覆盖除最后一个字符之外的任何真实值。除此之外,您应该假设 status = false 并在找到数字时将其设置为 true。您的代码认为任何包含其他字符的密码都是无效的。

示例:

pass = "1abcde"
status = true

1st iteration: char = 1 -> a digit, so status is not changed 
2nd iteration: char = a -> not a digit, so status will be set to false

loop will break since status is false -> result: not valid

要解决此问题,首先假设 status = false 并且当您找到数字集时 status = true。这样,当密码包含数字时,它将被视为有效。

示例:

status = false; //assume invalid password
for( char c : pass.toCharArray() ) {
  if( Character.isDigit( c ) ) {
    //found a digit
    status = true;

    //we're done since we found at least one digit
    break;
  }
}
return status;

不过,您的方法还可以改进:

迭代字符并收集它们的特征(例如大写、小写、数字、特殊字符等)。然后检查特征的数量以及是否存在所需的特征。

示例:

enum CharTraits {
  LOWER_CASE,
  UPPER_CASE,
  DIGIT,
  SPECIAL
}

Set<CharTraits> getPasswordTraits( String pw ) {
  Set<CharTraits> traits = new HashSet<>();

  for( char c : pw.toCharArray() ) {
    //better check for index of 0-9 otherwise you allow non-ascii digits as well
    if( Character.isDigit( c ) ) {
      traits.add( DIGIT );
    }
    else if ( Character.isUpperCase( c ) {
      traits.add( UPPER_CASE);
    }
    ... //the rest
  }

  return traits;
}

boolean isValid(String pass){
  Set<CharTraits> traits = getPasswordTraits( String pass )

  //Check for digits (just an example, you could check for more) 
  return traits.contains( DIGIT );

  //if you want to check for 3 out of 4 just do this:
  //return traits.size() >= 3;
}

关于java - java中调试密码验证代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32330964/

相关文章:

java - 用java在有限的时间内在输出中写一些东西

Java 空指针错误

java - GSSException : [. .] 不支持/启用使用 HMAC SHA1-96 的加密类型 AES256CTS 模式

java - 使用 Jackson 解析 Json 文件

java - 如何自定义莫里斯图的图例?

java - 将整数添加到最终数组列表

java - 我在尝试计算数字是否为回文时出现错误?

java - 如何使用selenium选择页面的一部分?

java - 无法启动嵌入式容器 Spring Boot 应用程序 org.apache.catalina.LifecycleException : A child container failed during start

并发