2014-03-26 180 views
1

我正在運行一個簡單的Java登錄系統,使用MySQL。對象引用返回null Java

登錄工作正常,但我想創建一個已通過get方法登錄的用戶對象。但是當輸出這些方法時,它們返回空值:

「使用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; 
} 
} 

---用戶---

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

想想你爲什麼期望u.getUsername()是非空的。首先,你要創建一個用戶實例:

User u = new User(); 

然後到一些地方usernamepassword變量分配一些值:

String username; 
String password; 

System.out.println("Enter Username: "); 
username = input.next(); 

System.out.println("Enter Password: "); 
password = input.next(); 

然後你打電話只接受登錄方法usernamepassword

DatabaseController dc = new DatabaseController(); 
dc.login(username, password); 

最後,你打印出這樣的信息:

System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword()); 

在這一點上,u僅僅是一個新實例化的對象 - 你還沒有分配任何值,或做任何工作,與它 - 沒有理由getUsernamegetPassword方法返回什麼,但null 。也許你想讓你的login方法返回User實例,而不是返回bool

+0

嗨馬特,謝謝你以非常體面的方式向我解釋。是的,我想要的方法返回一個用戶實例,而不是布爾值。謝謝:) –

4

u是在一個局部變量主分配但從未擁有其內部數據集。 u您正在設置生命DatabaseController。你需要dc.u。有些方法可以改進代碼本身的最佳實踐,其他人已經指出,但這似乎超出了這個問題的範圍。如果您想幫助改進您的設計,請給我離線消息。

現在讓世界成爲一個更安全的地方。切勿以明文形式存儲密碼。在存儲密碼時計算密碼(最好是Salted SHA256),然後在登錄時比較哈希值。你也有一個sql注入漏洞。您應該參數化該查詢。嘗試輸入

' OR 1=1;-- 

作爲用戶名與任何任意密碼,看看會發生什麼。您目前通過在代碼中進行密碼比較來規避這種情況,但它應該仍然是固定的。

+0

嘿喬納森,謝謝你的回答!我會注意到注入問題,該項目是爲了學校的目的,並不需要安全:) –

+0

@JesperBaungårdBruunHansen,其中之一可以通過使用參數化查詢輕鬆解決。這是一個單線的變化。你可以很容易地找到如何在jdbc文檔中做到這一點。 –

0

不要對您的Main類進行任何分配給用戶名和密碼。請致電u.setUserName()u.getUserName()進行設置。 您正嘗試訪問新的User對象,因此它返回null。

1

您可以初始化u,但您永遠不會初始化其屬性的用戶名和密碼。添加到您的代碼:

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-方法。我認爲其中一個是沒有必要的。另外,如果你想在這裏實現安全相關的功能,我建議你在你的DatabaseController private(特別是布爾值)中聲明所有的屬性,並且只能通過getter函數來訪問它。這樣,沒有其他類可以修改它。另外,你可能想要考慮讓這個類成爲最終的,以便其他類不能從它繼承,從而改變它的功能!

+0

你的意思是'u.setUsername(username);'對嗎? –

+0

我做的!修復!!!謝謝:-) – Christian

+0

嘿基督教,感謝您抽出時間。這解決了這個問題,但這些解決方案還不足以幫助我進一步開發該程序(您不知道這一點))。 –

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);