2011-06-12 233 views
0

我寫了一個簡單的代碼來測試登錄名和密碼(登錄名和密碼是由用戶給出的),然後我通過登錄名和密碼將它們存儲在數據庫中進行比較。但問題是函數的返回壞的結果(它甚至瀏覽它在第一行真正的所有行) 這是代碼:代碼比較登錄名和密碼

public String LoginPasswordCheck(Connection con) 
{ 
    HashMap<String,String> mapLoginPWD = new HashMap<String,String>(); 
    String sqlLogin; 
    String checkaccess="true"; 
    String log; 
    String pwd; 
    sqlLogin="select login ,password from profil_user;"; 

    try{ 
    st=(PreparedStatement) con.prepareStatement(sqlLogin); 
    ResultSet rs1 = st.executeQuery(); 

    while(rs1.next()) 
    { 
     log = rs1.getString("login"); 
     pwd=rs1.getString("password"); 
     mapLoginPWD.put(log, pwd); 
    } 

Iterator iteratorkey = mapLoginPWD.keySet().iterator(); 
String myKey=""; 
String value=""; 

while(iteratorkey.hasNext()) 
{ 
myKey = (String) iteratorkey.next(); 
value= mapLoginPWD.get(myKey); 
//login and password given by the user 
if(!(this.login.equalsIgnoreCase(myKey)) && !(this.password.equalsIgnoreCase(value))&& !(iteratorkey.hasNext())) 
    { 
      checkaccess ="fail"; 
    } 
else 

      checkaccess ="success"; 
} 

} 
catch (SQLException e) 
    { 
     e.printStackTrace(); 
    }  
return checkaccess; 
} 

回答

4

我不明白你爲什麼加載地圖的登錄和每個請求的密碼。您只需加載給定登錄名的密碼,如果失敗,則登錄名不存在。

此外,我不知道你是否真的想忽略密碼和登錄的情況。

您呈現的代碼失敗,因爲當您找到匹配的登錄名/密碼時,您不會退出循環。

你應該真的重構代碼並且不需要映射和循環。正如我所說的,只需查找用戶在數據庫中提供的登錄信息即可。

+0

我想將每個登錄名與等效密碼 – Rym 2011-06-12 21:15:46

+0

@Rym ok關聯起來,那麼方法名稱就會引起誤解。我以爲你想檢查一個給定的登錄密碼。 – mkro 2011-06-12 21:17:22

+0

啊,這是我的錯誤,我忘了改變它 – Rym 2011-06-12 21:19:55

2

有幾個問題:

  • 的SQL查詢將返回所有用戶的一個結果。您可以指定一個WHERE子句,將其限制爲0行或1行,具體取決於用戶是否存在。
  • 代碼遍歷結果並設置一個標誌。如果該標誌被設置一次,它可以(並且將會)在下一次迭代時重置。你應該跳出循環(這樣一旦認證被認爲是成功的,它不能被認爲是不成功的提供的用戶ID和密碼)。但是如果你要解決前面的問題,那麼你首先不需要循環。
  • 沒有必要將結果集的內容存儲在地圖中。這是多餘的,因爲地圖在每個查詢上重建並在執行後丟棄。