我正在尝试创建一个基本的登录页面(不是专门针对网站),我使用SQLite3来存储用户名和密码。注册(注册)新用户名很简单,因为我只需要通过SQLite3的java连接器输入将值插入数据库。但是,登录需要我将输入的用户名和密码与数据库中的相应值进行比较。有没有办法在没有创建过程/函数的情况下进行这种比较,因为SQLite不支持它们?
如果还有其他方法可以通过java进行此操作,请告诉我代码应该是什么样的。
答案 0 :(得分:0)
对于两者:JEE应用程序和最终的非JEE解决方案,您需要使用以下内容查询数据库:
select password from users where user = :user
对于JEE,它将由JEE容器完成,但无论如何都应该进行配置。
之后,您需要与用户提供的密码进行比较。
出于安全原因,建议在数据库中存储正确的散列密码以避免字典攻击。在存储之前和比较之前的散列场景中,您需要使用相同的算法处理给定的密码。
答案 1 :(得分:0)
ResultSet对象可用于存储从select查询中获取的结果集。通过传递属性名称,例如userPassword,可以通过调用结果集对象的getString函数将数据库密码存储到变量中。然后将此值与输入的密码进行比较以进行身份验证。以下是signIn方法的演示:
private boolean authenticate() {
if (usernameField.getText().length() == 0
|| passwordField.getPassword().length == 0) {
errorLabel.setText("Error! Please fill in the required fields.");
errorLabel.setVisible(true);
} else {
Connection connection = null; // for establishing a connection to the database
Statement statement = null; // for querying the database
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:Login.db");
//Established Connection
statement = connection.createStatement();
// query to be executed
String sqlQuery = "select * from login where username = '"
+ usernameField.getText() + "'";
// result of the executed query
ResultSet queryResult = statement.executeQuery(sqlQuery);
String databasePassword = null;
// Storing the password from the database
if (queryResult.next()) {
databasePassword = queryResult.getString("userpass");
}
String enteredPassword = new String(passwordField.getPassword());
// Storing the entered password from the form
if (enteredPassword.equals(databasePassword)) {
return true;
// User is now authenticated and you may enter your redirecting page code here
} else {
errorLabel.setText("Invalid username or password. Try again.");
errorLabel.setVisible(true);
}
statement.close();
connection.close();
} catch (Exception e) {
System.err.println(e.getClass().getSimpleName() + " : " + e.getMessage());
System.exit(0);
}
}
return false;
}
当方法返回true时,您可以将流重定向到另一个将用户登录到门户网站的方法。