【问题标题】:Problems with returning proper code using Character Password Java使用字符密码 Java 返回正确代码的问题
【发布时间】:2018-06-07 21:36:16
【问题描述】:

我遇到的问题是当有人输入包含数字、大写和小写的密码时,程序仍然说他们需要所有这些。

如果不满足,我需要程序列出所有密码要求。

例如:

A123456789aa 返回:“您至少需要一个小写字母。请输入您的密码:”

它应该返回:“输入终止键”

public static void main(String[] args) {

    Scanner input = new Scanner (System.in);

    boolean condition = true;
    while (condition) {
        System.out.print("Please Enter Your Password: ");
        String password = input.nextLine();

        if (password.equals("endofinput")) {
            System.out.print("Your password is valid"); condition = false;

        } else {
            System.out.print(passCheck(password));
            condition = true;
        }
    }
    input.close();
}


public static String passCheck(String password) {
    String specialChars = "/*!@#$%^&*()\"{}_[]|\\?/<>,." + " ";

      if (password.length() < 8) {
        return ("You need at least 8 characters. ");

    } for (int i = 0; i < password.length(); i++) {
        if (specialChars.contains(password.substring(i)))
            return ("Your password cannot contain special characters. ");
        else if (password.equals("password"))
            return ("Your password cannot be password. ");
        else if(!Character.isUpperCase(password.charAt(i)))
            return ("You need at least one uppercase. ");
        else if (!Character.isLowerCase(password.charAt(i)))
            return ("You need at least one lowercase. ");
        else if (!Character.isDigit(password.charAt(i)))
            return ("You need at least one digit. ");   
    }
return "Enter termination key";
}

【问题讨论】:

标签: java error-handling passwords


【解决方案1】:

您的 passCheck 方法遍历所有字符,如果一个字符未满足您的要求之一,则返回结果。另一种方法是假设输入无效,直到满足所有要求:

boolean foundUppercase = false;
    boolean foundLowercase = false;
    boolean foundDigits = false;
    //Dont have to do the check for password as input for every letter in the word.
    if (password.equals("password"))
        return ("Your password cannot be password. ");

    for (int i = 0; i < password.length(); i++) {
        if (specialChars.contains(password.substring(i)))
            //only in this case we can for sure say that the input is not valid
            return ("Your password cannot contain special characters. ");
        else if (Character.isUpperCase(password.charAt(i)))
            foundUppercase=true;
        else if (Character.isLowerCase(password.charAt(i)))
            foundLowercase= true;
        else if (Character.isDigit(password.charAt(i)))
            foundDigits = true;
    }
    if (!foundUppercase) {
        // uppercase letter missing
        return ("You need at least one uppercase. ");
    } else if (!foundLowercase) {
        // lower case letter missing
        return ("You need at least one lowercase. ");
    } else if (!foundDigits) {
        // missing digits
        return ("You need at least one digit. ");
    }

    return "Enter termination key";

【讨论】:

  • 感谢一位用户,我无法再次看到他的评论 我编辑了我的帖子并删除了放错位置的“!” - 符号
  • 我在你修好的时候把它删了,我睡着了
  • 此解决方案仍会导致问题持续存在。输入密码:a123456789 返回:“您至少需要一个小写字母。”
  • 看过我的编辑了吗?我删除了“!” if (Character.isUpperCase(password.charAt(i))) 行的符号?在我的测试中,您提供的密码返回:“您至少需要一个大写字母。”
  • 我已经进行了编辑,但仍然出现错误。输入密码:aAbaAvbede1254 返回:“您至少需要一个小写字母。”
【解决方案2】:

你可以使用这个验证功能

public static String passCheck(String password) {
    //String specialChars = "/*!@#$%^&*()\"{}_[]|\\?/<>,." + " ";
    String expected_pattern = "^[a-zA-Z0-9]{8,}$";
    String lowercase_pattern = "(.*)[a-z]+(.*)";
    String uppercase_pattern = "(.*)[A-Z]+(.*)";
    String digit_pattern = "(.*)[0-9]+(.*)";

    if (password == null || password.length() < 8) return ("You need at least 8 characters. ");     
    if (password.toLowerCase().equals("password")) return ("Your password cannot be password. ");
    if (!password.matches(lowercase_pattern)) return ("You need at least one lowercase. ");
    if (!password.matches(uppercase_pattern)) return ("You need at least one uppercase. ");
    if (!password.matches(digit_pattern)) return ("You need at least one digit. ");
    if (!password.matches(expected_pattern)) return ("Your password cannot contain special characters. ");

    return "Enter termination key";
}

【讨论】:

  • 当使用它作为解决方案时,问题仍然存在。输入密码:a123456789 返回:“您至少需要一个小写字母。”
  • 抱歉,我已经编辑了我的源代码以更改小写、大写和数字的正则表达式。
  • 嘿大卫,我注意到密码匹配不考虑密码或密码
  • 它现在可以在编辑的源代码中看到它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2014-07-07
相关资源
最近更新 更多