Попытка Войти 3 раза в Java Swing - PullRequest
0 голосов
/ 18 мая 2019

Моя проблема в том, что мой определенный код не уменьшился или не увеличился после первой попытки, он уменьшился на 1, но после другой попытки он не уменьшился. Пожалуйста, помогите мне, это проект. Это мне очень поможет. Это попытка входа в систему, если пароль верный, он перейдет на другую панель, но если он ошибочен, он не перейдет и предупредит 3 раза. Если попытки 3 раза. Аккаунт будет деактивирован в базе данных.


Я уже пытаюсь поместить объявление внутри, но ничего из этого не работает.

String x = BI.getText();
String x2 = WD.getText();
String x3 = FT.getText();
char[] pass = passtft.getPassword();
String password = new String(pass);
boolean container = false;
System.out.println(accs);
int x5 = 3;
if (isclick.equals(x)) {
    try {
        Connection con = DriverManager.getConnection(dburl, userdb, passdb);
        String query = "select * from accounts where accountnumber = '" + accs + "' ";
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery(query);
        while (rs.next()) {
            String pin = rs.getString("pin");
            String saltpin = rs.getString("saltpin");
            boolean verify = PasswordUtils.verifyUserPassword(password, pin, saltpin);
            if (verify == true) {
                container = true;
            } else {
                container = false;
                x5--;
            }
        }
        rs.close();
        st.close();
        con.close();
    } catch (Exception e1) {
        System.out.println(e1);
    }
    if (container == true) {
        PassPanel.setVisible(false);
        balancePanel.setVisible(true);
    } else {
        JOptionPane.showMessageDialog(null, "Wrong Pin!");
        passtft.setText("");
        amountT = "";
    }
    System.out.println(x5);
    if (x5 == 0) {
        try {
            Connection cay = DriverManager.getConnection(dburl, userdb, passdb);
            String qr = "update accounts set status = '" + "deactivated" + "' where accountnumber = '" + accs + "'";
            Statement rst = cay.createStatement();
            rst.executeUpdate(qr);

            cay.close();
            rst.close();
        } catch (Exception e2) {

        }
        JOptionPane.showMessageDialog(null, "You're card is blocked! You've reach your maximum limit! Please Contact our Customer Service !");
    }
}

Я ожидал уменьшения, и если попыток будет 3, он обновится до базы данных.

1 Ответ

1 голос
/ 20 мая 2019

Предложения:

Всегда есть, что сказать о преимуществах хорошего именования переменных и объектов и x this , x, что , или x, независимо от того, что просто не делает ' не попасть в это царство. Конечно, вы можете назначать любые свои имена вашим объектам, если они следуют тем правилам Java, которые написаны на камне , но ради вашего будущего здравомыслия (и других) было бы разумно быть несколько описательным с вашим именем. Это действительно помогает намного легче следовать коду и может быть чрезвычайно полезным для выявления ошибок даже до первого запуска кода. Итог, ваш выбор .... Я просто говорю: о)

Оставьте соединение с вашей базой данных открытым, пока не узнаете, что с ним покончено. Нет необходимости открывать и закрывать его все время для разных условий в рамках одного и того же метода. Используйте блок finally , чтобы закрыть объекты в конце вашего метода.

Используйте PreparedStatement при использовании строк SQL для работы с данными базы данных. Это поможет предотвратить возможность SQL-инъекций и сделает ваши строки SQL более безопасными. Прочтите эту ветку SO , чтобы немного больше понять этот вопрос.

Хотя это не совсем обязательно и в данном конкретном случае использования, я думаю, вам следует попытаться использовать цикл в то время как только для получения данных из вашей базы данных. Я бы не стал переходить к другим методам и проверять конкретные условия, в которых существует вероятность более чем одной итерации. В конце концов, что, если на первой итерации условие истинно, но на второй итерации (если она есть) то же условие ложно?

Задача под рукой:

Поскольку вы не раскрываете дом для своего примера кода, я должен предположить, что он содержится в блоке событий кнопки Submit или чего-то подобного, поэтому в приведенном ниже примере кода используется return операторы для выхода из метода события.

Вместо уменьшения счетчика переменных экземпляра попытки входа в систему в приведенном ниже примере счетчик увеличивается (с именем: loginAttempts ). Это делается после того, как была предпринята попытка получить соответствующие данные из базы данных на случай, если во время этого конкретного процесса произошла ошибка. Вы не хотели бы рисковать отключением чьей-то карты из-за того, что что-то вышло из-под его или ее контроля.

Прочитайте комментарии в коде:

// Class Member (instance) Variables
Connection conn = null;
int loginAttempts = 0;
int maxAttemptsAllowed = 3;
String acountNum = "AB42321"; 
String customerServicePhone = "XXX-XXX-XXXX";
//===========================================================

// Local (method) Variables
PreparedStatement pStmt = null;
ResultSet rs = null;
String password = new String(passtft.getPassword());
String pin = null;
String saltpin = null;
boolean viewPanel = false;

try {
    if (isclick.equals(BI.getText())) {
        conn = DriverManager.getConnection(dburl, userdb, passdb);
        pStmt = conn.prepareStatement("SELECT * FROM accounts WHERE accountnumber = ?");
        pStmt.setString(1, acountNum);
        rs = pStmt.executeQuery();
        while (rs.next()) {
            /* Check status to see if User's card was previously deactivated
               and wasn't yet reactivated by admin.   */
            String status = rs.getString("status");
            if (status.equalsIgnoreCase("deactivated")) {
                // Card is currently deactivated. Inform User
                JOptionPane.showMessageDialog(null, "<html><font color=red><b>Your Card has "
                        + "been previously Deactivated!</b></font><br><br>Please Contact our "
                        + "<font color=blue>Customer Service</font> at<br>Phone: " + 
                          customerServicePhone, "Card Deactivated", JOptionPane.ERROR_MESSAGE);
                // Get out of loop (don't bother with other data).
                break;
            }
            // Status is good so get pin and saltpin
            pin = rs.getString("pin");
            saltpin = rs.getString("saltpin");
        }

        loginAttempts++;    // Increment login counter

        /* Make sure pin and saltpin actually contain something 
           and that login attempts is less than or equal to the 
           max attempts allowed.    */
        if (pin != null && saltpin != null && loginAttempts <= maxAttemptsAllowed) {
            // Check the pin for validity
            viewPanel = PasswordUtils.verifyUserPassword(password, pin, saltpin);
            //PIN Valid!
            if (viewPanel) {
                PassPanel.setVisible(false);
                balancePanel.setVisible(true);

                // TO DO: Descriptively Log the LOGIN success in a DB Login Table.

                return; // Success. Get out of this particular method or event.
            }
            else {
                // pin is INVALID!
                JOptionPane.showMessageDialog(null, "<html>Wrong Pin Number Supplied!<br>"
                        + "You have <b><font color=red>" + (maxAttemptsAllowed - loginAttempts) + "</font>"
                        + "</b> attempt remaining.<br><br><font color=blue>Please try "
                        + "again...</font></html>", "Invalid PIN", JOptionPane.WARNING_MESSAGE);
                passtft.setText("");    // Clear JPasswordField
                passtft.requestFocus(); // Set focus to JPasswordField
                amountT = "";           // Clear Amount JTextField

                // TO DO: Descriptively Log the LOGIN failure in a DB Login Table.
            }
        }

        // If code ever reaches this point then...
        // See if passwordAttempts has reached Max login attempts
        if (loginAttempts == maxAttemptsAllowed) {
            /* The Maximum number of login attempts has been processed
               with no success so, apply deactivation!   */
            pStmt = conn.prepareStatement("UPDATE accounts SET status = ?"
                    + " WHERE accountnumber = ?");
            pStmt.setString(1, "Deactivated");
            pStmt.setString(2, acountNum);
            int i = pStmt.executeUpdate();
            System.out.println(i + " Records Updated"); // Can remove

             if (i > 0) { loginAttempts = 0; } // Zero the member variable loginAttempts

            // TO DO: Descriptively Log the Deactivation in a DB Login Table.

            JOptionPane.showMessageDialog(null, "<html><font align=justify>For safety reasons "
                    + "&nbsp;<b><font color=red>your Card has been Disabled</b></font>&nbsp; "
                    + "from<br>use since you have reached your maximum login attempts!<br><br>"
                    + "Please contact our <font color=blue>Customer Service</font> to have your "
                    + "card<br>reactivated! Phone: " + customerServicePhone + "</html>", 
                    "Card Disabled", JOptionPane.ERROR_MESSAGE);
        }
    }
}
catch (Exception ex) {
    // Inform User of an Error!
    JOptionPane.showMessageDialog(null, "<html><b><font color=red>A System Error "
        + "Has Occured!</font></b><br><br> Please contact Customer Service<br>"
        + "for assistance at: <font color=blue>" + customerServicePhone + 
        "</font></html>", "System Error!", 
        JOptionPane.ERROR_MESSAGE);
    // TO DO: Descriptively Log the Error in a DB Error Table.
}

// This finally block will always ensure 
// objects are closed if they are open.
finally {
    try {
        if (rs != null)    { rs.close();    }
        if (pStmt != null) { pStmt.close(); }
        if (conn != null)  { conn.close();  }
    }
    catch (SQLException ex) { 
        // TO DO: Descriptively Log the Error in a DB Error Table.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...