我正在使用MySQL运行一个简单的Java登录系统。
登录工作正常,但我想创建一个通过get方法登录的用户对象。但是在输出这些方法时,它们返回null:
"使用null和null"。
登录我做错了什么?
- 主要 -
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
User u = new User();
String username;
String password;
System.out.println("Enter Username: ");
username = input.next();
System.out.println("Enter Password: ");
password = input.next();
DatabaseController dc = new DatabaseController();
dc.login(username, password);
if(dc.a){
System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword());
}
else{
System.out.println("mismatch");
}
}
}
- 数据库控制器---
public class DatabaseController {
private DatabaseConnection db;
ResultSet rs;
boolean a;
User u = null;
String name;
String pass;
public DatabaseController()
{
db = new DatabaseConnection();
}
public boolean login(String username, String password)
{
try
{
rs = db.doQuery("SELECT Firstname, Password FROM Users WHERE Firstname ='"+ username+"';");
while(rs.next())
{
name = rs.getString(1);
pass = rs.getString(2);
if(pass.equals(password)){
a = true;
u = new User();
u.setPassword(password);
u.setUsername(username);
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
return a;
}
}
--- USER ---
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
答案 0 :(得分:4)
u
是main中的一个局部变量,已分配但从不具有其内部数据集。您设置的u
生活在DatabaseController
。您需要dc.u
。有些方法可以改进代码本身的最佳实践,其他人已经指出了,但这似乎超出了这个问题的范围。如果您希望帮助改进设计,请离线拍我留言。
现在让世界成为一个更安全的地方。切勿以纯文本格式存储密码。在存储密码时计算密码的哈希值(最好是Salted SHA256),然后在登录时比较哈希值。您还有一个SQL注入漏洞。您应该参数化该查询。尝试输入
' OR 1=1;--
作为任意密码的用户名,看看会发生什么。您目前正在通过在代码中进行密码比较来避免这种情况,但它仍应修复。
答案 1 :(得分:1)
你初始化你,但你永远不会初始化它的属性用户名和密码。将其添加到您的代码中:
u.setUsername(username);
u.setPassword(password);
您的代码如下所示:
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
User u = new User();
String username;
String password;
System.out.println("Enter Username: ");
username = input.next();
System.out.println("Enter Password: ");
password = input.next();
u.setUsername(username); //set u.username
u.setPassword(password); //set u.password
DatabaseController dc = new DatabaseController();
dc.login(username, password);
if(dc.a){
System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword());
}
else{
System.out.println("mismatch");
}
}
}
编辑:
使用您在DatabaseController中定义的User u
或main-method中的private
。我认为其中一个是没有必要的。
此外,如果您尝试在此处实现与安全相关的功能,我建议您在DatabaseController {{1}}中声明所有属性(尤其是布尔值),并仅通过getter函数访问它。这样,没有其他类可以修改它。此外,您可能需要考虑将该类设为final,以便其他类不能继承它,从而更改其功能!
答案 2 :(得分:0)
不要从Main类分配用户名和密码。通过致电u.setUserName()
和u.getUserName()
来设置它们。
您正在尝试访问新的User
对象,因此它返回null。
答案 3 :(得分:0)
考虑一下为什么期望u.getUsername()
非空。首先,您要创建一个用户实例:
User u = new User();
然后为某些本地username
和password
变量分配一些值:
String username;
String password;
System.out.println("Enter Username: ");
username = input.next();
System.out.println("Enter Password: ");
password = input.next();
然后你正在调用一个只接受username
和password
的登录方法:
DatabaseController dc = new DatabaseController();
dc.login(username, password);
最后,你打印出这条消息:
System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword());
此时,u
只是一个新实例化的对象 - 您没有为其分配任何值,或者使用它完成任何工作 - 没有理由getUsername
和{{ 1}}返回除getPassword
之外的任何内容的方法。也许您希望null
方法返回login
个实例,而不是返回User
?
答案 4 :(得分:0)
您正在返回一个布尔变量,该变量告诉登录过程是否成功。但要获取用户详细信息,您应该从登录过程返回用户。
// login method return the user when successful login happens otherwise null
public User login(String username, String password){
return u;
}
// get the user return by login process, if u is null then login fail otherwise login pass and show details
u = dc.login(username, password);