2

我的程序在初始化程序之前从用户那里获取用户名和密码身份验证,所以我创建了一个按钮登录,我将 ActionListener 关联到如下所示

   login.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
                if(txtUserName.getText().equals("Suraj") && (txtPwd.getPassword().toString()).equals("s123")){

                                dispose();
                                TimeFrame tFrame = new TimeFrame(userName);
                                tFrame.setVisible(true);
                                tFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                                tFrame.setLayout(new GridLayout());

                        } else {
                            JOptionPane.showMessageDialog(null,"User name or password don't match","Acces Denied", JOptionPane.ERROR_MESSAGE);
                        }

现在出现的问题是即使我输入了正确的密码,程序也会显示错误在此处输入图像描述消息

4

3 回答 3

5

getPassword()返回一个char[]toString()它不会像您假设的那样将内容作为字符串返回。

试试new String(txtPwd.getPassword()).equals("s123")

但是,它是 achar[]而不是 String 是有原因的。尝试在javadoc中查找它的安全方面。

于 2012-03-27T17:29:27.507 回答
3

注意:这应该是一个评论,但对于这个来说太长了。考虑对链接线程中的答案进行投票

正如 mKorbel 已经指出的,在getText() 与 getPassword()中有相当完整的讨论。

此外,阅读Swing 教程JPasswordField其中包含一个很好的示例,说明您应该如何比较密码(通过比较 char 数组,而不是通过将 char 数组转换为 a String) - 来自教程的小复制粘贴:

private static boolean isPasswordCorrect(char[] input) {
    boolean isCorrect = true;
    char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' };

    if (input.length != correctPassword.length) {
        isCorrect = false;
    } else {
        isCorrect = Arrays.equals (input, correctPassword);
    }

    //Zero out the password.
    Arrays.fill(correctPassword,'0');

    return isCorrect;
}

Hovercraft Full Of Eels在此答案开头的链接 SO 问题中的回答中很好地解释了您应该比较 char 数组的原因。

于 2012-03-27T21:15:00.830 回答
0

我有同样的问题:

private void loginActionPerformed(java.awt.event.ActionEvent evt) {

    char[] pass = passwordField.getPassword();
    String mypass = pass.toString();
    String user = (String) combo.getSelectedItem();


    try {
        String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
        Class.forName(driver);

        String db = "jdbc:odbc:LoginDB";
        con = DriverManager.getConnection(db);
        st = con.createStatement();
        String sql = "select * from Table2";
        rs = st.executeQuery(sql);

        while (rs.next()) {

            String AdminNewID = rs.getString("AdminID");
            String AdminNewPass = rs.getString("AdminPassword");

            if ((user.equals(AdminNewID)) && pass.equals(AdminNewPass)) {

                MyApp form = new MyApp();
                form.setVisible(true);

            } else {
                this.res.setText(" Incorrect User Name or Password");
            }
        }
    } catch (Exception ex) {
    }
}
于 2012-04-05T12:08:15.360 回答