2013-04-20 98 views
2

我正在構建一個簡單的創建帳戶用戶GUI,與我的LogInScreen類集成。它創建一個簡單的用戶,將其序列化,然後讓我在登錄程序中使用該訪問。問題是,當我輸入密碼時,他們從來都不正確。我的程序告訴我我的密碼不一樣,我總是遇到問題。我不知道如何解決這個問題,我想知道如何。我會在下面發佈我的代碼(整個事情,以及我的序列化類,因爲問題可能在這裏)。如何比較使用.equals()方法的兩個密碼(創建密碼和確認密碼)?

用戶類別:

package passwordProgram; 

import java.util.ArrayList; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.io.Serializable; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 

public class User implements Serializable, ActionListener { 

    public static ArrayList<String> allUsernames = new ArrayList<String>(); 

    String username; 
    String password; 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     User user = new User(); 
     user.mainGUI(); 
    } 



    JFrame frame; 
    JPanel panel; 
    JTextField createUsername; 
    JPasswordField createPassword; 
    JPasswordField confirmPassword; 
    JButton createAccount; 
    JLabel noValid; 

    public void mainGUI() { 
     noValid = new JLabel(); 
     frame = new JFrame("Create a new account!"); 
     panel = new JPanel(); 
     panel.setBackground(Color.ORANGE); 
     createPassword = new JPasswordField(10); 
     confirmPassword = new JPasswordField(10); 
     createUsername = new JTextField(10); 
     JLabel userTxt = new JLabel("New Username: "); 
     JLabel userPass = new JLabel("New Password: "); 
     JLabel confirmPass = new JLabel("Confirm Password: "); 
     createAccount = new JButton("Create your account!"); 

     panel.setLayout(new GridBagLayout()); 
     GridBagConstraints left = new GridBagConstraints(); 
     left.anchor = GridBagConstraints.WEST; 
     GridBagConstraints right = new GridBagConstraints(); 
     right.anchor = GridBagConstraints.EAST; 
     right.weightx = 2.0; 
     right.fill = GridBagConstraints.HORIZONTAL; 
     right.gridwidth = GridBagConstraints.REMAINDER; 

     frame.getContentPane().add(BorderLayout.NORTH, noValid); 
     frame.getContentPane().add(BorderLayout.CENTER, panel); 
     panel.add(userTxt, left); 
     panel.add(createUsername, right); 
     panel.add(userPass, left); 
     panel.add(createPassword, right); 
     panel.add(confirmPass, left); 
     panel.add(confirmPassword, right); 

     frame.getContentPane().add(BorderLayout.SOUTH, createAccount); 
     frame.setVisible(true); 
     frame.setSize(500, 300); 

     createAccount.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent event) { 
     if (createUsername.getText().length() <= 0) { 
      noValid.setText("That is not a valid username. Please try again."); 
      frame.getContentPane().add(BorderLayout.NORTH, noValid); 
     } 

     else if (allUsernames.contains(createUsername.getText())) { 
      noValid.setText("That username is already taken. Please try again."); 
      frame.getContentPane().add(BorderLayout.NORTH, noValid); 
     } 

      //THIS IS THE PART I'M CONFUSED ABOUT 
     else if (!(createPassword.getPassword().equals(confirmPassword.getPassword()))) { 
      noValid.setText("Your passwords do not match!"); 
      frame.getContentPane().add(BorderLayout.NORTH, noValid); 
     } else {  
      SaveUser sUser = new SaveUser(); 
      sUser.createAccount(this); 
      noValid.setText("Account created successfully"); 
      frame.getContentPane().add(BorderLayout.NORTH, noValid); 
     } 
    } 
} 

而串行化類:

package passwordProgram; 

import java.io.FileOutputStream; 
import java.io.ObjectOutputStream; 

public class SaveUser { 
    public void createAccount(User u) { 
     try { 
      FileOutputStream fileOS = new FileOutputStream("userInfo.txt"); 
      ObjectOutputStream objectOS = new ObjectOutputStream(fileOS); 
      objectOS.writeObject(u); 
      objectOS.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

首先,你永遠不應該結合一個類,它是GUI。 GUI和類應該都有單獨的文件,如果你想在不同的GUI或沒有GUI的地方再次使用'User',會導致什麼情況? – TheMerovingian 2013-04-20 02:34:37

+0

'serializable'類沒有聲明long類型的'static final serialversionuid'字段 – 2013-04-20 02:45:19

+0

與問題無關,儘管使用'frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)'來優雅地關閉Swing應用程序。此外,如果您正在使用'JDK 7',請停止使用'frame.getContentPane()。add(blahblah)',而不是簡單地使用'frame.add(blahblah,BorderLayout.CENTER)' – 2013-04-20 02:48:31

回答

7

getPassword()回報char[],不String。使用

!(Arrays.equals(createPassword.getPassword(), confirmPassword.getPassword())) 

代替

2

getPassword()返回char[]。因此,而不是嘗試:

if (!(new String(createPassword.getPassword()).equals(new String(confirmPassword.getPassword())) 
+2

您應該避免轉換密碼字符數組到字符串,這暴露了密碼潛在的黑客,因爲字符串變得內在於JVM(當然,它可能不是一個企業應用程序,但會盡可能鼓勵良好的實踐) – MadProgrammer 2013-04-20 02:53:31

3

你比較char陣列Objects(由getPassword()返回),而不是比陣列本身的內容。比較這2個數組最安全的方法是使用Arrays#equals

else if (!(Arrays.equals(createPassword.getPassword(), 
          confirmPassword.getPassword()))) { 
3

JPasswordField.getPassword()返回char[]。使用兩個char數組調用array1.equals(array2)(就像你正在做的那樣)將檢查它們是否是相同的對象引用,而不是如果它們具有相同的內容。你想用`Array.equals(char[] array1, char[] array2),像這樣:

else if (!Array.equals(createPassword.getPassword(), confirmPassword.getPassword())) 
5

除非這是一個玩具項目,你不應該存儲密碼明文。相反,存儲密碼的散列;當用戶登錄時,散列密碼並將其與存儲的散列進行比較。 This question's accepted answer has some sample hashing code

+1

+1是一個很好的觀點,但這並不是'實際上回答這個問題。問題實際上是關於比較兩個char []變量是否相等。 – 2013-04-20 02:42:18

+0

有罪,但當我發佈其他四人已經回答了這個問題。 – 2013-04-20 02:43:14

+0

@ Zim-ZamO'Pootertoot感謝您的回答,儘管它是無關緊要的。如果你想看看我的完整代碼並回答我的其他問題,你可以去[這裏](http://stackoverflow.com/questions/16116168/how-do-i-solve-this-serialization-error-on-我的日誌,在創建帳戶的程序) – hasherr 2013-04-20 03:18:25