Java 如何检查用户名/密码中的合法字符
下面的代码应该测试2个字符串(用户名和密码)的长度和允许的字符(应该是0-9.a-z,a-z)。legalCharacters ArrayList由字符a-z和0-9填充 测试合适长度的作品,但不测试合法字符 此测试返回用户名中的非法字符错误: 用户:aba 通行证:abaJava 如何检查用户名/密码中的合法字符,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
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