多用户登录java(管理员、用户、教师)
我在数据库中有三种用户类型。 这是我的登录表 当我选择admin作为usertype时,从数据库中输入用户名和密码,就会出现admin表单。但是,当我选择教师和学生并从数据库中键入用户名和密码时,只会显示JOptionpane,这是无效的详细信息 以下是我登录jframe的代码:多用户登录java(管理员、用户、教师),java,mysql,login,jframe,usertype,Java,Mysql,Login,Jframe,Usertype,我在数据库中有三种用户类型。 这是我的登录表 当我选择admin作为usertype时,从数据库中输入用户名和密码,就会出现admin表单。但是,当我选择教师和学生并从数据库中键入用户名和密码时,只会显示JOptionpane,这是无效的详细信息 以下是我登录jframe的代码: JButton btnLogin = new JButton("Login"); btnLogin.setFont(new Font("Book Antiqua", Font.PLAIN, 18)); btnLog
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) {
}
}
}
});
问题是,您正在请求
useRecord
表中的所有行,并在结果集中循环。当您在第一行中找不到用户名或密码的匹配项时,将显示JOptionPane
和break
跳出循环,从而阻止任何其他可能的检查
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;
}
}
更好的方法可能是直接向数据库查询与用户名
和密码
匹配的所有结果,例如
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-作为旁注,您应该避免以这种方式使用纯文本存储密码(事实上,您应该避免将密码存储在
字符串中)。就我个人而言,我会使用某种单向散列算法在数据库中存储密码,这样,如果数据库被破坏,那么他们是否获得密码就无关紧要了-IMHO你的if-else层次结构不正确,检查it-if-else层次结构是否正确这是一种使用SQL的危险方式,因为任何人都可以轻松地对jar进行反编译,获取所需信息,然后在数据库上创建一个DROP TABLE
或DROP DATABASE
,然后突然间每个用户/表/数据库都消失了。