【问题标题】:How to check for legal character in a username / password如何检查用户名/密码中的合法字符
【发布时间】:2017-06-22 12:15:18
【问题描述】:

以下代码应测试 2 个字符串(用户名和密码)的长度和允许的字符(应为 0-9.a-z、A-Z)。 legalCharacters ArrayList 由字符 a-z 和 0-9 填充。

测试适当的长度有效,但不适用于合法字符 此测试在用户名中返回非法字符错误: 用户:aba 通过:aba

public DataResponseType checkForDataErrors(String username, String password) {
    responseType = null;
    boolean isIllegalUsername = false;
    boolean isIllegalPassword = false;
    if (username.length() < 3 || username.length() > 15) {
        responseType = DataResponseType.INVALID_USERNAME_LENGTH;
    } else if (password.length() < 3 || password.length() > 15) {
        responseType = DataResponseType.INVALID_PASSWORD_LENGTH;
    } else {
        for (int x = 0; x < username.length(); x++) {
            for (int z = 0; z < legalCharacters.size(); z++) {
                Character test = username.toLowerCase().charAt(x);
                if (!test.equals(legalCharacters.get(z))) {
                    if (z == legalCharacters.size() - 1) {
                        isIllegalUsername = true;
                        break;
                    }
                }
            }
            if (isIllegalUsername) {
                break;
            }
        }
        for (int x = 0; x < password.length(); x++) {
            for (int z = 0; z < legalCharacters.size(); z++) {
                Character test = password.toLowerCase().charAt(x);
                if (!test.equals(legalCharacters.get(z))) {
                    if (z == legalCharacters.size() - 1) {
                        isIllegalPassword = true;
                        break;
                    }
                }
            }
            if (isIllegalPassword) {
                break;
            }
        }
        if (isIllegalUsername) {
            responseType = DataResponseType.INVALID_USERNAME_CHARACTERS;
        } else if (isIllegalPassword) {
            responseType = DataResponseType.INVALID_PASSWORD_CHARACTERS;
        } else {
            responseType = DataResponseType.VALID;
        }
    }
    return responseType;
}

有人知道如何解决这个问题吗?还是以更简单的方式来做(我不明白谓词是如何工作的,也找不到好的解释)? 如果需要其他代码,请询问。

【问题讨论】:

  • 你读过正则表达式吗?
  • 使用正则表达式。它使工作变得容易下面的链接可以帮助stackoverflow.com/a/8148112/2863159
  • 正则表达式示例:if (!username.matches("^[A-Za-z0-9]+$")) responseType = DataResponseType.INVALID_USERNAME_CHARACTERS;

标签: java enums enumeration


【解决方案1】:

检查合法字符是正则表达式的理想用例,例如参见https://docs.oracle.com/javase/tutorial/essential/regex/,尤其是字符类:https://docs.oracle.com/javase/tutorial/essential/regex/char_classes.html

【讨论】:

    【解决方案2】:

    如果当前字符不是legalCharacters 集合中的最后一个字符,您的算法总是将isIllegalUsername 标志设置为false。发生这种情况是因为一旦找到与当前字符匹配的合法字符,您就不会停止内部循环,例如:

    boolean isLegalUsername = false;
    ...
    if (test.equals(legalCharacters.get(z))) {
      isLegalUsername = true;
      break;
    }
    

    除此之外,您还可以通过使用List.contains() 并根据结果设置标志来轻松跳过第二个for循环。

    if(!legalCharacters.contains(test)) {
      isIllegalUsername = true;
    } 
    

    或者,更好的是,使用其他答案中所述的正则表达式。

    【讨论】:

      【解决方案3】:

      我建议退到这里。你已经走上了危险的道路。

      你在这里继续添加一点验证;还有一个。您的代码已经非常糟糕了。我会建议一个更多的 OOP 解决方案,就像这样。

      首先,创建一个类似的接口:

      public interface Validator() {
         public void check(String content) throws ValidiationException;
      }
      

      然后您在实现此接口的自己的类中实现每个验证。

      然后你做这样的事情:

      public class DataChecker {
        private final static List<Validator> validators = Arrays.asList(new LengthValidator, new BlaValidator, new ... );
      

      实际验证变成:

      try {
        for (Validator v : validators) {       
          v.check(someString);
        }
        // passed all checks
      } catch (ValidationException v) {
        // v contains details such as: a nice error message to give to the user!
      

      对于这些小类的实际实现;参考你得到的其他答案。但如前所述:您不仅应该关注您需要实现的功能,还应该关注您正在编写的代码的可读性和可维护性!

      【讨论】:

        【解决方案4】:

        这是一个使用您正在尝试的蛮力方法的解决方案:

        class Main {
            public static boolean isValid(String value) {
                String legalCharacters = "abcdefghijklmnopqrstuvwxzy0123456789";
                boolean valid = true;
                if (value.length() < 3 || value.length() > 15) {
                    valid = false;
                }
                else {
                    // For each character in the value
                    for (int x = 0; x < value.length() ; x++) {
                        boolean found = false;
                        // Look for the character in legalCharacters
                        for (int z = 0; z < legalCharacters.length(); z++) {
                            char c = value.charAt(x);
                            c = java.lang.Character.toLowerCase(c);
                            // If we found the character
                            if (c == legalCharacters.charAt(z)) {
                                // Remember we found it
                                found = true;
                            }
                        }
                        // If we did not find it
                        if (!found) {
                            // This is an invalid value
                            valid = false;
                            // Break out of the outer for loop
                            break;
                        }
                    }
                }
                return valid;
            }
        
            public static void main(String[] args) {
                String username = "aba";
                String password = "aba";
                System.out.format("is %s valid: %b%n", username, isValid(username));
                System.out.format("is %s valid: %b%n", password, isValid(password));
                username = "###";
                password = "@@@";
                System.out.format("is %s valid: %b%n", username, isValid(username));
                System.out.format("is %s valid: %b%n", password, isValid(password));
            }
        }
        

        输出

        is aba valid: true
        is aba valid: true
        is ### valid: false
        is @@@ valid: false
        

        试试repl.it

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-24
          • 2017-11-29
          • 2013-02-06
          • 2020-02-01
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多