Java 如何检查用户名/密码中的合法字符

Java 如何检查用户名/密码中的合法字符,java,enums,enumeration,Java,Enums,Enumeration,下面的代码应该测试2个字符串(用户名和密码)的长度和允许的字符(应该是0-9.a-z,a-z)。legalCharacters ArrayList由字符a-z和0-9填充 测试合适长度的作品,但不测试合法字符 此测试返回用户名中的非法字符错误: 用户:aba 通行证:aba public DataResponseType checkForDataErrors(String username, String password) { responseType = null; bool

下面的代码应该测试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;
}
public DataResponseType checkfordata错误(字符串用户名、字符串密码){
responseType=null;
布尔值IsAllegalUserName=false;
布尔值IsAllegalPassword=false;
如果(username.length()<3 | | username.length()>15){
responseType=DataResponseType.INVALID\u USERNAME\u LENGTH;
}else if(password.length()<3 | | password.length()>15){
responseType=DataResponseType.INVALID\u PASSWORD\u LENGTH;
}否则{
对于(int x=0;x
有人知道怎么解决这个问题吗?或者用一种更简单的方法(我不明白谓词是如何工作的,也没有找到一个好的解释)?
如果需要其他代码,请询问。

检查合法字符是正则表达式的理想用例,请参阅示例,在特定的字符类中:.

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

boolean isLegalUsername = false;
...
if (test.equals(legalCharacters.get(z))) {
  isLegalUsername = true;
  break;
}
除此之外,通过使用并根据结果设置标志,您可以轻松跳过第二个for循环

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

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

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

你在这里保持一点验证;还有一个。你的代码已经很糟糕了。我会建议一个更面向对象的解决方案,类似这样的

首先,创建一个界面,如:

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 ... );

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

下面是一个使用您正在尝试的暴力方法的解决方案:

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));
    }
}

试一试

你读过正则表达式吗?使用正则表达式。它可以简化下面的工作链接可以帮助示例正则表达式:
如果(!username.matches(“^[A-Za-z0-9]+$”)responseType=DataResponseType.INVALID_username_字符
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