Java getText()与getPassword()的比较
我目前正在为一家虚构的公司设计一个登录系统,现在我所拥有的只是主登录,这需要大量的清理。下面是我的登录处理程序Java getText()与getPassword()的比较,java,swing,passwords,jpasswordfield,Java,Swing,Passwords,Jpasswordfield,我目前正在为一家虚构的公司设计一个登录系统,现在我所拥有的只是主登录,这需要大量的清理。下面是我的登录处理程序 private class LoginButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equal
private class LoginButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equals("password")) {
JOptionPane.showMessageDialog(null, "Congratulations on logging in!");
} else {
JOptionPane.showMessageDialog(null, "Error on login!");
}
}
}
照现在的情况,这很好用,但是当我把它改成
_pwd.getPassword.equals("password")
当所有内容都正确输入时,它直接指向else语句。
这里怎么了?下面是完整的程序
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame {
private static final int HEIGHT = 90;
private static final int WIDTH = 400;
JTextField _uid = new JTextField(10);
JPasswordField _pwd = new JPasswordField(10);
JButton _login = new JButton("Login");
JButton _reset = new JButton("Reset");
public Main() {
super("Login - Durptech");
Container pane = getContentPane();
setLayout(new FlowLayout());
add(new JLabel("User ID:"));
add(_uid);
add(new JLabel("Password:"));
add(_pwd);
add(_login);
_login.addActionListener(new LoginButtonHandler());
add(_reset);
_reset.addActionListener(new ResetButtonHandler());
/*if(_uid.getText().equals("") && _pwd.getText().equals("")) {
_login.setEnabled(false);
} else {
_login.setEnabled(true);
}*/
setSize(WIDTH, HEIGHT);
setResizable(false);
setLocation(500, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private class ResetButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
_uid.setText("");
_pwd.setText("");
_uid.requestFocusInWindow();
}
}
private class LoginButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equals("password")) {
JOptionPane.showMessageDialog(null, "Congratulations on logging in!");
} else {
JOptionPane.showMessageDialog(null, "Error on login!");
}
}
}
public static void main(String[] args) {
new Main();
}
}
你会想很好地了解API,让它成为你最好的朋友。解决这个问题的关键是查看
JPasswordField#getPassword()
返回的内容。提示1:它不是字符串。提示2:您可能希望使用java.util.Arrays类方法解决此问题
getPassword不返回字符串的原因是Java处理字符串的方式——它可以将字符串存储在字符串池中,允许字符串在程序中停留的时间比预期的长,并使字符串可能被恶意软件检索——这是您不希望密码发生的事情。使用字符数组更安全
顺便说一句,不要使用JPasswords不推荐的
getText()
方法,也不要使用newstring(char[])
构造函数将char数组更改为字符串,因为它们都返回字符串,因此不安全。JPasswordField.getPassword()
返回char[]
而不是字符串。这样做是为了安全。您应该比较数组中的字符,而不是查看char[].是否等于(字符串) password.getPassword()
返回字符[],字符[]不等于字符串。因此,您需要将其与char[]进行比较:
if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))
正如所有其他答案所说,当调用getPassword()方法时,JPasswordField返回一个char[]。然而,我在示例登录表单中设置它的方式是我有一个验证输入的方法。我有两个用于存储用户名[]和密码[]的数组,然后是用户名输入和密码输入。在“我的方法”中输入的密码在继续之前将char[]更改为字符串,您可以这样做:
String PasswordTyped = new String(_pwd.getPassword());
然后将该字符串放入“if”语句中:
if (_uid.equals("Nathan") && PasswordTyped.equals("password") {
JOptionPane.showMessageDialog(null, "Congrats, you logged in as Nathan");
}
然而,正如我提到的,我的验证方法在用户名[]和密码[]的两个数组上运行,同时接受字符串和字符[]作为输入。我将复制并粘贴我的方法,以便您可以暗示它,如果您愿意:
public static void validate(String u, Char[] pass) {
String password = new String(pass);
boolean uGood = false;
String[] usernames = new String[2];
String[] passwords = new String[usernames.length];
usernames[0] = "Don";
passwords[0] = "password";
usernames[1] = "Jared";
passwords[1] = "password";
for (int i = 0; i < usernames.length; i++) {
if (usernames[i].equals(u) && passwords[i].equals(password)) {
uGood = true;
}
}
if (uGood) {
System.out.println("Hooray, you did it!");
}
else {
JOptionPane.showMessageDialog(null, "Incorrect Username\nand/or Password.");
}
}
我不懂Java,但我认为缺少括号可能是相关的?我认为equals不适用于将一个数组与另一个数组进行比较,因为数组不会重写该方法,并且最终会对对象类使用默认的equality方法,该方法只执行对象相等(==
)。改为使用java.util.Arrays#equals(…)
或java.util.Arrays#deepEquals(…)
方法。@HovercraftFullOfEels当然了,我真蠢,谢谢你的更正。请参阅编辑。通过使用“password”.tocharray()
将密码放入字符串池,如果我没有弄错的话,无论是否使用getPassword
或getText
方法。
validate(_uid.getText(), _pwd.getPassword());