2013-10-13 90 views
0

我在數據庫中有三種用戶類型。 http://oi44.tinypic.com/2z8qflw.jpg多用戶登錄java(管理員,用戶,教師)

而且我的繼承人登錄表單 http://oi44.tinypic.com/20p5v04.jpg

當我選擇admin作爲用戶類型,請從數據庫的用戶名和密碼,管理員的形式顯示出來。但是,當我選擇教師和學生,並從數據庫中輸入用戶名&時,只有JOptionpane顯示哪個是無效的詳細信息。

繼承人我的登錄的JFrame代碼:

JButton btnLogin = new JButton("Login"); 
btnLogin.setFont(new Font("Book Antiqua", Font.PLAIN, 18)); 
btnLogin.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
    String sql = "SELECT * FROM useRecords "; 
    try { 
     ps = conn.prepareStatement(sql); 
     rs=ps.executeQuery(); 
     String user = usern.getText(); 
     String pwd = new String (passw.getPassword()); 
     String type =(String)typeUser.getSelectedItem(); 
     while(rs.next()) { 
     String uname = rs.getString("username"); 
     String pass = rs.getString("password"); 
     if ((user.equals(uname)) && (pwd.equals(pass))) { 
      if (type.equals("Admin")) { // ... admin 
      dispose(); 
      aCai aCai = new aCai(); 
      aCai.setVisible(true); 
      aCai.setExtendedState(Frame.MAXIMIZED_BOTH); 
      } else if (type.equals("Teacher")) { // ... teacher 
      dispose(); 
      tCai tCai = new tCai(); 
      tCai.setVisible(true); 
      tCai.setExtendedState(Frame.MAXIMIZED_BOTH); 
      } else { 
      dispose(); 
      sCai sCai = new sCai(); 
      sCai.setVisible(true); 
      sCai.setExtendedState(Frame.MAXIMIZED_BOTH); 
      } 
     } else { 
      JOptionPane.showMessageDialog(null, "User name and password do" 
             + " not match!","ALERT!", 
             JOptionPane.ERROR_MESSAGE); 
      break; 
     } 
     } 
    } catch(Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } finally { 
     try{ 
     rs.close(); 
     ps.close(); 
     } catch(Exception e) { 
     } 
    } 
    } 
}); 
+0

你的if否則層次結構是不正確的,檢查它 –

+0

如果其他層次似乎很好 – Batty

+0

這是一個危險的使用SQL的方式,因爲任何人都可以輕鬆地反編譯jar,獲得所需的信息,然後做一個'DROP TABLE'或'DROP DATABASE'在你的數據庫上,突然間每個用戶/表/數據庫都消失了。 – Vallentin

回答

1

問題是,你所要求的從useRecord表中的所有行,在結果集循環。當你無法找到上的第一行的用戶名或密碼匹配,就展現出了JOptionPanebreak圈外,防止任何其他可能的檢查

while(rs.next()) { 
     String uname = rs.getString("username"); 
     String pass = rs.getString("password"); 
     if ((user.equals(uname)) && (pwd.equals(pass))) { 
      //... 
     } else { 
      JOptionPane.showMessageDialog(null, "User name and password do" 
             + " not match!","ALERT!", 
             JOptionPane.ERROR_MESSAGE); 
      break; 
     } 
} 

一個更好的辦法是要求數據庫所有usernamepassword直接匹配,例如,結果......

String user = usern.getText(); 
String pwd = new String (passw.getPassword()); 
String type =(String)typeUser.getSelectedItem(); 
String sql = "SELECT * FROM useRecords where username=? and password=? and type = ?"; 
try { 
    ps = conn.prepareStatement(sql); 
    ps.bindString(1, user); 
    ps.bindString(2, pwd); 
    ps.bindString(3, type); 
    rs=ps.executeQuery(); 

PS-作爲一個側面說明,你應該避免以這種方式儲存使用明文密碼(其實你應該避免將它們存儲在String)。就個人而言,我會使用某種單向哈希算法來存儲數據庫中的密碼,這樣,如果數據庫被泄露,那麼它們將不會影響(很多),如果他們獲得密碼 - 恕我直言