2012-03-27 4 views
2

Mein Programm Benutzer nimmt Namen und Passwort-Authentifizierung von dem Benutzer vor, das Programm initialisiert, so habe ich eine Schaltfläche Login, auf die i Action als Show assoziiert untenJPasswordField einig Hash-Code in String-Typen umgewandelt Rückkehr

login.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent event){ 
       if(txtUserName.getText().equals("Suraj") && (txtPwd.getPassword().toString()).equals("s123")){ 

           dispose(); 
           TimeFrame tFrame = new TimeFrame(userName); 
           tFrame.setVisible(true); 
           tFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
           tFrame.setLayout(new GridLayout()); 

         } else { 
          JOptionPane.showMessageDialog(null,"User name or password don't match","Acces Denied", JOptionPane.ERROR_MESSAGE); 
         } 

Jetzt Das Problem, das auftritt, ist, auch wenn ich das richtige Passwort eingeben, zeigt das Programm einen Fehler Mes enter image description here sage

+1

jede Frage, keine Ahnung what9s im Rest des Codes versteckt, Arbeit für mich, vielleicht besseren Weg [getText() vs getPassword()] gelesen werden würde (http://stackoverflow.com/questions/9798066/gettext-vs-getpassword) – mKorbel

+0

@mKorbel +1 für den Link zu der Frage, die alles – Robin

Antwort

5

getPassword() gibt eine char[] zurück. Die toString() darauf gibt den Inhalt nicht als Zeichenfolge zurück, wie Sie annehmen.

Versuchen Sie new String(txtPwd.getPassword()).equals("s123").

Es gibt jedoch einen Grund, es ist ein char[] und kein String. Versuchen Sie, den Sicherheitsaspekt in the javadoc.

+0

+1 erklärt, für die Verwendung 'neuer String (...)', I dachte, du hast es verpasst, also meine Antwort gepostet, jetzt gelöscht, nachdem ich diese eine Zeile gelesen habe :-) –

+0

Ich hatte gelesen, dass du int in String und Char in String umwandeln kannst, indem du die entsprechenden toString() -Methoden verwendest, warum sonst hätte Sie haben die Methode toString() bewiesen, wenn wir char nicht konvertieren konnten Strahl in String ?? – lucifer

+1

Wie ich in [mein Kommentar hier] (http://stackoverflow.com/questions/9798066/gettext-vs-getpassword/9798110#comment12481480_9798110) angedeutet habe, umgehen Sie den gesamten Sicherheitsmechanismus mit "s123". Besser wäre es Char Arrays zu vergleichen – Robin

3

nachzuschlagen. Hinweis: Dies sollte ein Kommentar sein, ist aber viel zu lang dafür. Erwägen Sie, die Antworten auf die Antworten im verknüpften Thread zu geben

Wie bereits von mKorbel angegeben, gibt es eine ziemlich vollständige Diskussion in getText() vs getPassword().

Außerdem lesen Sie die Swing tutorial über JPasswordField, die ein schönes Beispiel enthält, wie Sie das Passwort vergleichen sollten (durch Vergleich char-Arrays und nicht durch die char-Array zu einem String Umwandlung) - kleine Kopie Paste aus dem Tutorial:

Der Grund, warum Sie Char-Arrays vergleichen sollten, wird durch Hovercraft Full Of Eels in his answer in der verknüpften SO-Frage zu Beginn dieser Antwort erklärt.

+0

Ich plante vorher, diese Funktion zu implementieren, aber ich dachte, für das Speichern von ein paar Zeilen Code können wir die ToString() -Methode verwenden, und es funktioniert wie von Johannes – lucifer

+0

@lucifer Mit 'toString' macht einen String was im StringPool endet und alle Sicherheitsmaßnahmen im 'JPasswordField' umgeht. Also ja, es funktioniert, aber es ist falsch – Robin

+0

eigentlich bin ich vergleichsweise neu zu Java, was ist StringPool? in welchem ​​teil von java werde ich solche konzepte lernen?Da ich Sun Core Java Fundamentals und Deital und Deital Java benutze, um zu programmieren, ist der einzige Teil, den sie in der Core-Java-Version dieser Bücher gegeben haben, die grundlegenden Dinge, die alle Details von JVM, StringPool oder den Sicherheitsfunktionen ausschließen hatte bemerkt, dass, wenn Sie das Passwort nehmen, löschen Sie das Zeichen-Array für die Sicherheit betreffen in welchem ​​Buch werde ich diese tiefen Verständnis von Java bekommen? – lucifer

0

hatte ich das gleiche Problem:

private void loginActionPerformed(java.awt.event.ActionEvent evt) { 

    char[] pass = passwordField.getPassword(); 
    String mypass = pass.toString(); 
    String user = (String) combo.getSelectedItem(); 


    try { 
     String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
     Class.forName(driver); 

     String db = "jdbc:odbc:LoginDB"; 
     con = DriverManager.getConnection(db); 
     st = con.createStatement(); 
     String sql = "select * from Table2"; 
     rs = st.executeQuery(sql); 

     while (rs.next()) { 

      String AdminNewID = rs.getString("AdminID"); 
      String AdminNewPass = rs.getString("AdminPassword"); 

      if ((user.equals(AdminNewID)) && pass.equals(AdminNewPass)) { 

       MyApp form = new MyApp(); 
       form.setVisible(true); 

      } else { 
       this.res.setText(" Incorrect User Name or Password"); 
      } 
     } 
    } catch (Exception ex) { 
    } 
} 
+0

Bitte speichern Sie keine Passwörter im Klartext. Bitte schluck keine Ausnahmen. Bitte verwenden Sie konventionelle Benennung. – trashgod

+0

Sie sollten dies versuchen. 'new String (txtPwd.getPassword()) gleich ("IhrPasswort")' statt zu schaffen, was Sie getan haben 'char [] pass = passwordField.getPassword(); String mypass = pass.toString(); ' Dies ist besser als das Erstellen eines Char-Array-Objekts und das Erstellen eines String-Objekts – lucifer