因此,多虧了下面的建議,我將使用語句的第一種方法更改為使用 Prepared Statements ,我還將 verifyUser 方法與 ConnectDB 分開,將其放入一個新的用戶類(在我的作業中要求)?,F在我不再使用任何 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
提交
取消