在java中调试密码验证码

时间:2015-09-01 11:55:07

标签: java

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

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

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

3)密码至少应有一位数。

我已经完成了1和2,但我无法弄清楚3号。

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

我想知道我的代码有什么问题。希望你们能帮助我。

    int main() {
        int counter = 0;
        while (counter < 20) {
            ++counter;
        }

        return 0;
    }

2 个答案:

答案 0 :(得分:1)

您可以在每次迭代中设置状态,有效地覆盖除最后一个字符之外的任何真值。除此之外,您应该假设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;
}

答案 1 :(得分:0)

如果您的密码是abc123,则该方法会看到第一个字符,看到它没有数字,因此它设置了&#34; status&#34;为假。这就是为什么你的时间不会进入第二轮。状态必须是真实的。