检查表中是否存在带密码的用户名

时间:2014-06-23 23:12:28

标签: java sql-server stored-procedures callable-statement

我创建了一个登录系统,在阻止帐户密码失败超过三次之前检查尝试。问题是我需要检查用户名是否存在,如果没有,则打印一条消息,说明该ID不存在;但我不知道该怎么做。我的意思是,我知道如何做到这一点,但我不知道如何在Java上做到这一点。

Theese是我储存的食物

登录

create proc usp_Login
   @id varchar(50),
   @pw varchar(50)
as
   select id, pw from Login where id = @id and pw = @pw and lock = 0 and tries < 4
   update Login set tries = 0 where id = @id and pw = @pw;

尝试

create proc usp_Attempts
   @id varchar(50)
as
   select id, tries from Login where id = @id and tries < 4
   update Login set tries = tries+1 where tries < 4 and id = @id

阻止用户

create proc usp_Lock
   @id varchar(50)
as
   update Login set lock = 1 where id = @id

java部分是这样的:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        CallableStatement cStmt = null;
        ResultSet rs = null;
        try {
            cStmt = conn.prepareCall("{call usp_Login(?, ?)}");
            cStmt.setString(1, this.txtID.getText());
            cStmt.setString(2, this.txtPW.getText());
            cStmt.execute();

            rs = cStmt.getResultSet();

            if (rs.next()) {
                System.out.println("Login done");
                cStmt.close();
                rs.close();
                conn.close();
            } else {
                cStmt = conn.prepareCall("{call usp_Attempts(?)}");
                cStmt.setString(1, this.txtID.getText());
                cStmt.execute();

                rs = cStmt.getResultSet();

                if (rs.next()) {
                    System.out.println("Invalid login");
                } else {
                    cStmt = conn.prepareCall("{call usp_Lock(?)}");
                    cStmt.setString(1, this.txtID.getText());
                    cStmt.execute();

                    System.out.println("Login blocked");
                    cStmt.close();
                    rs.close();
                    conn.close();
                }
            }
        } catch (SQLException ex) {
            System.out.print(ex);
        }
    }

我知道这可能不是登录系统的最佳方式,但我还在学习,这是我现在做的最好的主意。 希望有人可以帮我做id验证部分, 提前谢谢。

1 个答案:

答案 0 :(得分:1)

将所有这些逻辑放入一个存储过程(SP)中。在这个SP的主体的最末端只做SELECT v AS RESULT;,其中v是一个整数值。根据登录尝试结果,使此值v不同,例如

  • v = 0表示登录成功;
  • v = 1表示登录失败,因为没有这样的用户名;
  • v = 2表示登录失败,因为尝试登录时帐户已被锁定;
  • v = 3表示登录失败,因为密码不匹配,但SP没有锁定帐户;
  • v = 4表示登录失败,因为密码不匹配,并且由于尝试次数太多,SP刚刚锁定了帐户。

当然,通过RESULT值,您可以以任何您喜欢的方式编码其他登录尝试结果。然后在Java代码中检查SP RESULT值,以确切知道在此登录尝试期间发生了什么。在Java代码中,您将获得一个名为RESULT的1行和1列的结果集,只需检查其值并按您喜欢的方式继续。

相关问题