因此,多亏了下面的建议,我将使用语句的第一种方法更改为使用 Prepared Statements ,我还将 verifyUser 方法与 ConnectDB 分开,将其放入一个新的用户类(在我的作业中要求)。现在我不再使用任何 NPE,而是另一个 NPE,它是 MySQL JDBC 驱动程序的 Class Not Found Exception。用户类的代码如下:public class Users {private String login;private String password;public Users(String login, String password) { this.login = login; this.password = password;}public String getUsername() { return login;}public String getPassword() { return password;}public void setPassword(String password) { this.password = password;}public void setUsername(String login) { this.login = login;}public boolean verifyUser(String login, String password) throws SQLException { ConnectDB cdb = new ConnectDB(); Connection cn = DriverManager.getConnection(cdb.url, cdb.login, cdb.password); PreparedStatement ps = cn.prepareStatement("SELECT password FROM users WHERE login LIKE ? ");ps.setString(1,username); ResultSet rs=ps.executeQuery(); rs.next(); if (rs.getString(2).equals(password)) { System.out.println("TEST"); return true; } else return false;}}这是我的 ConnectDB 类:public class ConnectDB {String url = "jdbc:mysql://localhost:3306/entreprise";String login = "root";String password = "kamoulox369";Connection connection = null;Statement st = null;ResultSet rs = null;PreparedStatement ps = null;public void getConnection() { try { Class.forName("com.example.mysql.jdbc.Driver"); connection = DriverManager.getConnection(url, login, password); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); }}}
1 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
servlet 或 jdbc 并不简单。它们都容易出错。
你有一个并发问题,资源问题,你没有关闭任何东西(包括搁浅的连接),还有一个 sql 注入漏洞。
在这里使用静态成员是灾难性的。每个请求都在不同的线程上执行,它们都将覆盖其他线程正在使用的对象。每个请求都应该使用局部变量来处理。
数据库连接永远不会关闭,您的数据库将耗尽连接并在某些时候停止工作。完成后关闭所有 jdbc 对象。
将用户输入的输入连接到您运行的 sql 中,允许用户在没有有效密码的情况下进入或运行任意 sql。使用 PreparedStatement。
添加回答
举报
0/150
提交
取消