我目前正在为一家虚构的公司设计一个登录系统,目前我所有的登录都是主登录,需要很多清理工作。下面是我的登录处理程序。
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();
}
}发布于 2012-03-21 11:09:47
password.getPassword()返回一个char[],而char[]不等于String,所以你需要将它与char[]进行比较:
if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))发布于 2012-03-21 11:07:12
您将希望很好地了解API,使其成为您最好的朋友。解决这个问题的关键是看看JPasswordField#getPassword()返回了什么。提示1:它不是一个字符串。提示2:您可能希望使用java.util.Arrays类方法来解决这个问题。
getPassword不返回字符串的原因是因为Java处理字符串的方式--它可以将它们存储在字符串池中,允许字符串在程序中停留的时间比您预期的要长,并且使字符串有可能被恶意软件检索--这是您不希望密码发生的事情。使用char数组更安全。
顺便说一句,不要使用JPasswords弃用getText()方法,也不要使用new String(char[])构造函数将字符数组更改为字符串,因为这两种方法都返回字符串,因此不安全。
发布于 2012-03-21 11:09:03
JPasswordField.getPassword()返回char []而不是String。这样做是为了安全起见。您应该比较数组中的字符,而不是查看char [] .equals(字符串);
https://stackoverflow.com/questions/9798066
复制相似问题