【问题标题】:Unable to get required JDBC Exception无法获取所需的 JDBC 异常
【发布时间】:2015-08-19 14:03:27
【问题描述】:

我已经使用 java servlet 和 jsp 创建了一个登录表单。用户名和密码等登录信息保存在数据库中。 我的问题是,当用户输入我的 java 类在数据库中找不到的信息时,我没有得到异常。如果登录数据在 Db 中不可用,如何创建异常?

public boolean loginValidator(String e, String p) throws SQLException {

    String userName = e;
    String password = p;
    boolean validate = false;
    try{
    PreparedStatement ps = connection.prepareStatement("SELECT * FROM user WHERE email = ? and password = ?");
    ps.setString(1, userName);
    ps.setString(2, password);

    ResultSet rst = ps.executeQuery();

    while (rst.next()) {
        validate = (rst.getString("email").equals(userName)) && ((rst.getString("password").equals(password)));
    }}
    catch(SQLException ex){
        System.out.println(ex.getMessage());
        validate = false;
    }


return validate;
}

这实际上是我的 java 类中的一个方法,它验证布尔类型并将其发送到 servlet,然后 servlet 决定根据返回的布尔类型来指导或限制对应用程序的访问。

PS:javaWeb的新手。

【问题讨论】:

    标签: java jdbc exception-handling


    【解决方案1】:

    而且是 SQL 的学习者,对吧?因为没有异常,如果DB表中没有这样的行。该查询只返回空的ResultSet。所以你必须检查结果集是否为空(然后检查电子邮件和密码 - 但恕我直言,这是多余的)。

    public boolean loginValidator(String userName, String password) {
        try{
            PreparedStatement ps = connection.prepareStatement("SELECT * FROM user WHERE email = ? and password = ?");
            ps.setString(1, userName);
            ps.setString(2, password);
            ResultSet rst = ps.executeQuery();
            return rst.next(); // whether DB contains such record
        } catch(SQLException ex){
            ex.printStackTrace(); // TIP: use logging
        }
        return false;
    }
    

    顺便说一句。我强烈建议您将明文密码存储在数据库中。

    【讨论】:

    • 请阐明您的陈述“顺便说一句。我强烈建议您不要将明文密码存储在数据库中。”
    • 我应该如何存储密码而不是?
    • 密码必须加密存储,即您必须存储密码的哈希值。我建议使用BCrypt - 非常简单的用法和非常强大的算法。
    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多