【问题标题】:Using Arraylists to store passwords in Java GUI在 Java GUI 中使用 Arraylists 存储密码
【发布时间】:2013-03-22 02:20:53
【问题描述】:

我正在上我的第一个计算机编程课程,我的任务是创建一个允许用户预订机票的程序。这是我第一次使用 Java GUI,到目前为止我已经成功了,除了我无法让我的程序识别输入的密码。我在下面粘贴了我的代码。有人可以告诉我如何解决这个问题吗?谢谢!这是我的课:

public class OptionGUI extends JPanel  implements ActionListener
{
   ArrayList<String>passworddatabase= new ArrayList();
   ArrayList<String> usernamedatabase= new ArrayList();
   JButton newaccount = new JButton("Create a new account");
   JButton login= new JButton("Login");
   public int response;
  public OptionGUI()
  {

    newaccount.setVerticalTextPosition (AbstractButton.CENTER);
    newaccount.setHorizontalTextPosition(AbstractButton.LEADING);
    newaccount.setActionCommand("create");

    login.setVerticalTextPosition(AbstractButton.CENTER);
    login.setHorizontalTextPosition(AbstractButton.TRAILING);
    login.setActionCommand("login");
    login.setEnabled(true);

    newaccount.addActionListener(this);
    login.addActionListener(this);

    add(newaccount);
    add(login);
   }
  public void actionPerformed(ActionEvent e)
  {
   {
       if ("create".equals(e.getActionCommand()))
      {

        newaccount.setEnabled(true);
        login.setEnabled(false);

        JPanel logininfo= new JPanel();
        JLabel usernameLbl= new JLabel("Choose a username:");
        JLabel passwordLbl= new JLabel("Choose a password:");
        JTextField username= new JTextField();
        JPasswordField password= new JPasswordField();

        logininfo.add(usernameLbl);
        logininfo.add(username);
        logininfo.add(passwordLbl);
        logininfo.add(password);


        logininfo.setVisible(true);

        int input2 = JOptionPane.showConfirmDialog(frame,logininfo, "Create your account:"
                            ,JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        char[] enteredPassword= password.getPassword();
        char[] enteredPassword2= passwordconfirm.getPassword();
        String newusername= username.getText();
        String newpassword= String.valueOf(enteredPassword);
        String newpassword2= String.valueOf(enteredPassword2);

        String[] options = { "Login", "Cancel" };
        response = JOptionPane.showOptionDialog(null, "Your account has been successfully created! Please login to continue.", "Confirmation",JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options,options[0]);                    

            }
        passworddatabase.add(newpassword);
        usernamedatabase.add(newusername);

        }
       if ("loginbutton".equals(e.getActionCommand())|| response==0)
       {  
        login.setEnabled(true);
        newaccount.setEnabled(false);
        JPanel panel= new JPanel();
        panel.setLayout(new GridLayout(2,2));
        JLabel usernameLbl = new JLabel("Username:");
        JLabel passwordLbl = new JLabel("Password:");
        JTextField username = new JTextField();
        JPasswordField passwordFld = new JPasswordField();

        panel.add(usernameLbl);
        panel.add(username);
        panel.add(passwordLbl);
        panel.add(passwordFld);

        panel.setVisible(true);

        int input = JOptionPane.showConfirmDialog(frame, panel, "Enter your password:"
                            ,JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        String inputPassword= String.valueOf(passwordFld);
        String inputUsername= username.getText();

        for(int i=0; i < passworddatabase.size(); i++) 
        {
         if (passworddatabase.get(i).contains(inputPassword))
        {
           JOptionPane.showMessageDialog(null, "Welcome to AIR Ticket Reservation!");
         }

        else
         {   JOptionPane.showMessageDialog(null, "The username or password you entered does not exist.", "Error",
                                    JOptionPane.ERROR_MESSAGE);
                }
            }                
        }
    }
}
    }

还有我的司机:

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JPasswordField;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JDialog;
import java.awt.GridLayout;
import java.util.Arrays;
import java.awt.EventQueue;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.AbstractButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

public class Driver 
{
   public static void main(String[] args)
    { 

        JFrame option= new JFrame ("Ticket Reservation");
        option.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        option.setSize(500,300);
        option.setLocationRelativeTo(null);
        OptionGUI newContentPane= new OptionGUI();
        option.setContentPane(newContentPane);

        option.setVisible(true);
    }             
}

虽然很长,但非常感谢!

【问题讨论】:

  • 正如您所说,您的代码有点长,没有多少人愿意通读所有内容。您能否将问题隔离为仅几行代码(约 10 行左右),然后编辑您的原始帖子?
  • 您似乎正在将输入的密码与完整的密码数据库进行比较-因此,如果您确实使代码正常工作,则 user1 的密码将对 user2 有效。这就是你想要的吗?
  • 感谢您指出这个问题。我将如何解决这个问题?另外,有什么办法可以防止每次关闭程序并重新打开 ArrayList 时重置它?
  • 当你有机会时,用两种方式改变你的程序。首先,永远不要将密码存储在 Java 字符串中。始终使用 char 数组。字符串会一直留在系统中,直到垃圾收集器处理掉它们,谁知道什么时候会发生呢?入侵您的程序的人可能会看到密码。其次,永远不要将密码原样存储在数据库中。始终对值使用散列函数;您的数据库应该有一个可用的。并且,在将密码放入数据库之前对其进行加盐;任何有关数据库和密码学的书都会提供详细信息。避免字典攻击。
  • 好的。但是,如果我使用 char 数组,我是否能够将多个密码存储在一个数组中,或者我是否必须为每个新密码实例化一个新数组?另外,如果我关闭程序,char 数组会自行清除吗?

标签: java swing arraylist


【解决方案1】:

我看到在 loginButton 操作命令处理中您可能遇到了问题。您应该使用 JPasswordField 的值而不是 JPasswordFieldObject 本身。我很确定,你不是故意这样写的。请检查是否有帮助。

       String.valueOf(passwordFld.getPassword());

尝试输入密码字符串的上述代码行。

    String inputPassword= **String.valueOf(passwordFld);**
    String inputUsername= username.getText();

    for(int i=0; i < passworddatabase.size(); i++) 
    {
     if (passworddatabase.get(i).contains(inputPassword))
    {

【讨论】:

  • 非常感谢!我一直在尝试解决这个问题很长时间,但我无法弄清楚问题是什么。
  • 不客气!很高兴我能帮上忙……如果您不介意,请将此标记为答案:P
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2023-03-19
  • 2020-07-27
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多