首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getText() vs getPassword()

getText() vs getPassword()
EN

Stack Overflow用户
提问于 2012-03-21 11:02:57
回答 4查看 35K关注 0票数 4

我目前正在为一家虚构的公司设计一个登录系统,目前我所有的登录都是主登录,需要很多清理工作。下面是我的登录处理程序。

代码语言:javascript
复制
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!");
        }
    }
}

就像现在一样,这可以很好地工作,但是当我将它更改为

代码语言:javascript
复制
_pwd.getPassword.equals("password")

当所有内容都输入正确时,它会直接转到else语句。这里出了什么问题?下面是完整的程序。

代码语言:javascript
复制
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();
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-21 11:09:47

password.getPassword()返回一个char[],而char[]不等于String,所以你需要将它与char[]进行比较:

代码语言:javascript
复制
if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))
票数 5
EN

Stack Overflow用户

发布于 2012-03-21 11:07:12

您将希望很好地了解API,使其成为您最好的朋友。解决这个问题的关键是看看JPasswordField#getPassword()返回了什么。提示1:它不是一个字符串。提示2:您可能希望使用java.util.Arrays类方法来解决这个问题。

getPassword不返回字符串的原因是因为Java处理字符串的方式--它可以将它们存储在字符串池中,允许字符串在程序中停留的时间比您预期的要长,并且使字符串有可能被恶意软件检索--这是您不希望密码发生的事情。使用char数组更安全。

顺便说一句,不要使用JPasswords弃用getText()方法,也不要使用new String(char[])构造函数将字符数组更改为字符串,因为这两种方法都返回字符串,因此不安全。

票数 13
EN

Stack Overflow用户

发布于 2012-03-21 11:09:03

JPasswordField.getPassword()返回char []而不是String。这样做是为了安全起见。您应该比较数组中的字符,而不是查看char [] .equals(字符串);

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9798066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档