0

我想确保当用户输入用户名和密码时,通过检查输入是否与用户表中的某些行匹配来完成身份验证。到目前为止的代码如下:它只允许数据库中的第一个用户登录。请建议我如何正确设置它。谢谢

private class thehandler implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent ae) {
        String namevalue = usertext.getText();
        String pwdvalue = pwdtext.getText();

        //read values from user table in sql database    
   try {
        Class.forName("com.mysql.jdbc.Driver");
        String conUrl = "jdbc:mysql://localhost/hall?" +
                               "user=root&password=blend";

        Connection con = DriverManager.getConnection(conUrl);
        Statement stmt = con.createStatement();

        ResultSet rs = stmt.executeQuery("SELECT * FROM user");

        while(rs.next()) {

            if(namevalue.equals(rs.getString("userName")) && pwdvalue.equals(rs.getString("password"))) {
            JOptionPane.showMessageDialog(null, "You are logged in", 
                    "Makhall login", JOptionPane.INFORMATION_MESSAGE);
            //move on to homepage if user is valid
            homePage home = new homePage();
            home.setAlwaysOnTop(rootPaneCheckingEnabled);
            }
            else {

            JOptionPane.showMessageDialog(null, "Incorrect username or password",
                    "Error", JOptionPane.ERROR_MESSAGE);
            }
            break;
        }
    }
    catch (SQLException e) {
        System.out.println("SQL Exception: "+ e.toString());
    } 
    catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: "+ cE.toString());
    }

  }
}
4

3 回答 3

3

对不起,我认为这是糟糕的代码。您将所有内容混合在一起:UI、数据库连接、查询等。Java 是一种面向对象的语言。好的对象设计的租户之一是凝聚力:让一个班级做好一件事。

首先将您的数据库查询分离到一个数据访问对象中。让它工作,测试它,并让其他客户简单地使用它。您将通过让更简单的对象协作来构建复杂的解决方案。

您的直接问题是您的 SELECT 需要一个 WHERE 子句:WHERE username = ?

您只想检查手头用户的密码。

问号是故意的:使用 PreparedStatement,而不是 Statement。

于 2012-06-13T12:42:43.963 回答
3

您正在从数据库中选择所有用户。永远不要这样做。相反,选择具有给定登录名的用户。如果存在,请检查密码。如果不存在,则登录本身不正确。

还:

  • 将数据库访问代码与 UI 代码分开。那些应该在单独的类中。
  • 不要将纯文本密码存储在数据库中。对它们加盐,对它们进行散列,检查密码,对密码加盐,散列,并将其与存储在数据库中的加盐和散列密码进行比较。
于 2012-06-13T12:43:25.217 回答
0

我也做了同样的程序。看这里:

String m=jt1.getText();
String n= new String(jt2.getPassword());
try{        
           Connection con = DriverManager.getConnection("jdbc:mysql://localhost/darshanproject","root","");
           Statement st = con.createStatement();
           String q="select * from emp where UID='"+m+"'";
           ResultSet rs=st.executeQuery(q);
           rs.next();
           String user, pass;
           user =rs.getString("UID");
           pass =rs.getString("password");
           { if(m.compareTo(user)==0)
                 if(n.compareTo(pass)==0)
                     System.out.println("login Success");
                 else
                     System.out.println("Wrong Password");

           }
       }catch(Exception ex){
           System.out.println(ex);
       }
于 2015-10-25T16:31:26.677 回答