【问题标题】:Username and Password not Matching Error Messages in JavaJava 中的用户名和密码不匹配错误消息
【发布时间】:2015-06-26 13:16:57
【问题描述】:

下面的表格,检索 MySQL 数据库用户名和密码,并与用户的输入进行检查。

不显示密码或用户名不正确的错误消息。我尝试了很多方法,但没有按预期工作。

如何编写该功能?

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

    String val1 = usernametxt.getText();
    String val2 = passwordtxt.getText();

    if( val1.equals("") || val2.equals("")){
           JOptionPane.showMessageDialog(null, "Fill all fields and try again .... ");
           usernametxt.setText("");
           passwordtxt.setText("");


    }

    try{

        String sql1 = "SELECT username FROM logininfo WHERE username LIKE '"+val1+"'" ;
        String sql2 = "SELECT password FROM logininfo WHERE password LIKE '"+val2+"'" ;

        pst1 = conn.prepareStatement(sql1);
        pst2 = conn.prepareStatement(sql2);


         rs1 = pst1.executeQuery();
         rs2 = pst2.executeQuery();

        while(rs1.next()){
            String uname=rs1.getString("username");
            //System.out.println(uname);

        while(rs2.next()){
           String pwd=rs2.getString("password");
            //System.out.println(pwd);



         if(val1.equals(uname) && val2.equals(pwd)){

            chg2.setVisible(true);
            this.setVisible(false);
        } else{
             JOptionPane.showMessageDialog(null, "Login Information is Incorrect. Try Again.... ");
        }

        if(!(val1.equals(uname)) || !(val2.equals(pwd))){
             JOptionPane.showMessageDialog(null, "Login Information is Incorrect. Try Again.... ");


                }
        }}




    }catch(SQLException | HeadlessException e){
        JOptionPane.showMessageDialog(null, "errrrrr"+e);

    }

}

【问题讨论】:

    标签: java mysql


    【解决方案1】:

    您可以通过传递 2 个参数使用一个查询来完成

     "SELECT username FROM logininfo WHERE username  = '"+val1+"' 
      and password =  '"+val2+"' " ;
    

    您还需要注意 sql 注入。使用preparedstatement 传递参数并将它们绑定到查询。

    你的情况

     while(rs1.next()){
            String uname=rs1.getString("username");
            //System.out.println(uname);
         }  // <-- close it...
    
          while(rs2.next()){
           String pwd=rs2.getString("password");
            //System.out.println(pwd);
        }  <--- close it..
    

    把最后的两个}}去掉再试...

    【讨论】:

    • 最好使用“?”在 PreparedStatements 上设置参数和 setXXX() 方法来避免 SQL 注入漏洞。
    • 我在答案中提到过。请检查@AdriaanKoster
    • 哦,是的,你是对的。但是为什么不在你的代码中显示正确的方式呢?
    【解决方案2】:

    您可能需要通过用户名和密码查找用户:

    String username = usernametxt.getText();
    String password = passwordtxt.getText();
    // avoid SQL injection by setting query parameters with '?'
    String sql = "SELECT * FROM logininfo WHERE username = ? AND password = ?";
    PreparedStatement st = conn.prepareStatement(sql);
    st.setString(1, username);
    st.setString(2, password );
    ResultSet rs = st.executeQuery();    
    if (!rs.next()) {
        // no records found, login  failed
        JOptionPane.showMessageDialog(null, "Login Information is Incorrect.");
    }
    else {
        // record found, login succeeded
        // assuming here that there is a unique constraint in the database
        // on (username, password), otherwise multiple records could be found
        chg2.setVisible(true);
        this.setVisible(false);
    }
    

    【讨论】:

    • 它工作了..我也添加了错误消息以显示空条目..感谢您的帮助:) @Adriaan Koster
    【解决方案3】:

    我有这样的问题,当我从安全文件中删除 md5 加密时,我解决了,但也许您的数据库使用 md5 加密,而您的应用程序没有尝试看起来

    【讨论】:

      【解决方案4】:

      让用户知道String val2 = passwordtxt.getText(); 没有返回加密值。 Java 密码字段可能不会返回纯文本值。

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 1970-01-01
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        相关资源
        最近更新 更多