2016-03-18 1 views
-1

Ich muss JOptionPane verwenden, um einen Namen, Sozialversicherungsnummer, Benutzername und Passwort zu erhalten. Ich habe den Namen und die soziale Sicherheit, aber ich brauche die anderen beiden. Das Passwort verwirrte mich wirklich. Es heißt:Wie kann man in JOptionPane nach einem Passwort mit einzigartigen Komplexitäten und Ausnahmen fragen?

Passwort sollte mindestens 8 Zeichen lang sein. Sie sind Groß- und Kleinschreibung. Unsere Komplexität Test ist, dass ein Passwort mindestens eine Zahl/Ziffer enthalten sollte, ein anderes Großbuchstabe als die erste Brief (wenn der einzige Großbuchstabe ist der erste Buchstabe, der die Komplexitätsprüfung nicht besteht), eine spezielle Zeichen (Nicht-Buchstabe; Nicht-Ziffer). Leerzeichen sind nicht erlaubt.

Ich bin ratlos. Hier ist der Rest von meinem Code so weit: http://pastebin.com/3UGviCzG

+1

Bitte können Sie den Code in der Frage stellen sich nicht ein Link. –

+0

Es sagt, es ist zu lang – Josh

+1

Lesen Sie dies dann. http://stackoverflow.com/help/mcve –

Antwort

1

How to ask for a password with unique complexities and exceptions in JOptionPane?

Ob Sie eine Eingabe von JOptionPane akzeptieren wird hier nicht zur Debatte. Die Logik für die Passwortprüfung ist die gleiche, auch wenn Sie eine Eingabe von Util.Scanner erhalten.

Wenn Sie nicht wissen, wo Sie anfangen sollen, können Sie das Problem immer in kleinere Teile aufteilen. Beispielsweise. Erstellen Sie eine Hilfsmethode für jede spezifische Prüfung.

Exmaple:

public static boolean isCorrectLength(String pw){ 
    //your implementation 
} 

public static boolean hasSpecialChar(String pw){ 
    //your implementation  
} 

public static boolean isAlphaNumeric(String pw){ 
    //your implementation  
} 

//And so on.. 

Nachdem Sie alle oben genannten Teilprobleme gelöst. Verwenden Sie sie in Ihrer Methode zur Validierung Passwort:

public static boolean isValidPassword(String pw){ 
    return (isCorrectLength(pw) && hasSpecialChar(pw) && isAlphaNumeric(pw)); 
} 

Natürlich ist es möglich, nur eine Methode zu erstellen. Aber wenn Sie "feststecken" und nicht wissen, was zu tun ist. Ich glaube, dass die Lösung Ihres großen Problems in kleinere Bits hilft.

+0

@Josh Weißt du, wo du jetzt anfangen solltest? – user3437460

+0

http://pastebin.com/Bzi1PJLQ Das ist, was ich gefunden habe, aber es gibt Kompilierungsfehler. – Josh

+0

Program.java:84: Fehler: nicht erreichbar Anweisung String password = JOptionPane ^ Program.java:93: Fehler: fehlende return-Anweisung } – Josh

1

Beginnen Sie mit der Zerlegung Ihres Problems in überschaubare Brocken.

Password should be at least 8 characters in length.

Nun, das ist einfach ...

if (password.length > 7) { 
    ... 

should contain at least one number/digit

Character.isDigit(char) 

one capital letter other than the first letter (if the only capital letter is the first letter, that doesn’t pass the complexity test)

Character.isUpperCase(char) 

Sie erhalten eine zusätzliche Prüfung tun müssen, wenn die Anzahl der Großbuchstaben 1 ist um festzustellen, ob es das erste Zeichen nicht ist ...

if (!Character.isUpperCase(password[0])... 

one special character (non-letter; non-digit)

Character.isLetterOrDigit(char) 

Spaces are not allowed.

Character.isWhitespace(char) 

Sie dies überprüfen müssen, da diese Registerkarten enthält, neue Linien und ein paar andere Leerzeichen

Nun brauchen Sie nur die Logik zusammenfügen.

Die Mehrheit Ihrer Arbeit ist Zeichen und Überprüfung zählen, um zu sehen, ob Sie die richtige Nummer haben oder nicht

Nun, weil ich pedantisch bin, Ich mag mit einer Schnittstelle starten, die den Kern Vertrag definiert ..

.
public interface PasswordValidator { 
    public boolean isValid(char[] password); 
} 

und dann eines generieren oder mehrere Implementierungen ...

public class ComplexPasswordValidator implements PasswordValidator { 

    @Override 
    public boolean isValid(char[] password) { 
     boolean isValid = false; 
     // At least 8 characters long 
     if (password.length > 7) { 
      int digitCount = 0; 
      int capitalCount = 0; 
      int nonAlphaDigitCount = 0; 
      int whiteSpace = 0; 
      for (char c : password) { 
       if (Character.isDigit(c)) { 
        digitCount++; 
       } else if (Character.isUpperCase(c)) { 
        capitalCount++; 
       } else if (Character.isWhitespace(c)) { 
        // This includes tabs, new lines etc... 
        whiteSpace++; 
       } else if (!Character.isLetterOrDigit(c)) { 
        nonAlphaDigitCount++; 
       } 
      } 
      // Must have a captial character which is not the first character 
      if (capitalCount > 1 || (capitalCount == 1 && !Character.isUpperCase(password[0]))) { 
       // Must have a digit, 1 non alpha/digit character and no whitespace 
       if (digitCount > 0 && nonAlphaDigitCount == 1 && whiteSpace == 0) { 
        isValid = true; 
       } 
      } 
     } 
     return isValid; 
    } 

} 

nun diese werfen keine Ausnahmen, so dass die einzige Feedback werden Sie i erhalten s true oder false. Es wäre kein Problem für Sie, Ausnahmen hinzuzufügen, wenn Sie sie benötigen.

Dann könnte man einfach nutzen so etwas wie ...

PasswordValidator pv = new ComplexPasswordValidator(); 
System.out.println(pv.isValid(new char[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'T', 'e', 's', 't', '_', 'I', 'A', 'm', 'G', 'r', '8'})); 
System.out.println(pv.isValid(new char[]{'B', 'a', 'd', '_', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '8'})); 
System.out.println(pv.isValid(new char[]{'B', 'a', 'd', ' ', 'P', 'a', 's', 's', 'w', 'o', 'r', 'd', '8'})); 

Sie können Setup eine Folge von Methoden, die eine Instanz von PasswordValidator nahm und übergeben Sie einfach in was auch immer Validator wollten Sie

The compiling issue is from the password field....?

Problem # 1 ...

Platzieren Code nach der return-Anweisung, das macht den Code unwiderruflich

public static boolean checkSSN(String social) { 

    //... 
    return valids; 

    //Code to check password 
    String password = JOptionPane 
      .showInputDialog("Please insert a valid password "); 
    boolean valid = isValid(password); 
    if (isValid(password)) { 
     System.out.println("Valid Password"); 
    } else { 
     System.out.println("Invalid Password"); 
    } 
} 

Problem # 2 ...

Failing to define the parameter type... 

public boolean isValid(password) { // What type is password? 
+0

http://pastebin.com/rb0wATkH Das ist, was ich bisher gefunden habe, aber das Passwort Teil kompiliert nicht richtig und ich glaube nicht, dass ich alle Ausnahmen habe – Josh

+0

@Josh Haben Sie meinen Algorithmus versucht? Erfüllt es die grundlegenden Anforderungen? – MadProgrammer

+0

@Josh Haben Sie sich unsere Lösungen hier angesehen?Anstatt nach Hilfe zu fragen, um zu implementieren, scheint Sie nach jemandem zu suchen, um Ihre Codes aufzuräumen. – user3437460