在NetBeans中通过MySQL实现JFrame间用户名传递问题排查
问题
我想获取登录用的用户名,基于MySQL创建查询来展示该用户的所有数据(比如在Dashboard中显示登录用户的名称)。但操作后Dashboard端的getUsername()返回null,登录端却能正常获取;试过用数组存储字符串也变成null。附上Login、Dashboard代码及输出结果,请问问题出在哪?
相关代码及输出
Login代码
if(rs.next()) { StudentHomeDashboard studentHomeDashboard = new StudentHomeDashboard(); loginDetails = rs.getString("RegNO"); setUsername(loginDetails); System.out.println("Username : " + getUsername()); //Correct details JOptionPane.showMessageDialog(null, "Successfully Logged In!"); //close login form this.setVisible(false); this.dispose(); studentHomeDashBoard.show(); } else { JOptionPane.showMessageDialog(null, "INVALID DETAILS!"); //clear the form automatically usernameField.setText(""); passwordField.setText(""); }
Dashboard代码
//GET NAME, YEAR, SCHOOL, PROGRAMME try { StudentLogin login = new StudentLogin(); //Fetch Values for the specific user String studentDetails = "SELECT * FROM student WHERE RegNO = '"+login.getText()+"'"; System.out.println("Login is: " + login.getText()); ps = ConnectionDatabase.DbConnection().prepareStatement(studentDetails); rs = ps.executeQuery(); while(rs.next()) { String fullName = rs.getString("FullName"); String regNO = rs.getString("RegNO"); studentNameLbl.setText(fullName); regNumberLbl.setText(regNO); } } catch (Exception e) { }
输出结果
run: Login is: Connection Established! Connection Established! Login is: Connection Established! Username : AP003/0007/12 BUILD SUCCESSFUL (total time: 12 seconds)
问题分析与解决
核心问题
Dashboard里StudentLogin login = new StudentLogin();这行代码新建了一个全新的StudentLogin实例,和之前登录时的实例完全无关,自然获取不到之前设置的用户名,所以login.getText()返回空字符串。
另外还存在两个隐性问题:
- 直接拼接SQL语句,存在严重的SQL注入风险;
- catch块空实现,异常被吞掉,无法排查潜在问题;
- 数据库资源未正确关闭,可能导致连接泄漏。
修正方案
1. 传递登录用户名到Dashboard
修改Login代码,通过构造方法把登录成功的用户名传给Dashboard:
if(rs.next()) { loginDetails = rs.getString("RegNO"); setUsername(loginDetails); System.out.println("Username : " + getUsername()); JOptionPane.showMessageDialog(null, "Successfully Logged In!"); this.setVisible(false); this.dispose(); // 把用户名通过构造方法传入Dashboard StudentHomeDashboard studentHomeDashboard = new StudentHomeDashboard(loginDetails); studentHomeDashboard.show(); }
2. 修改Dashboard接收参数并安全查询
private String loggedInRegNO; // 新增带参数的构造方法 public StudentHomeDashboard(String regNO) { initComponents(); // 保留原UI初始化方法 this.loggedInRegNO = regNO; loadStudentDetails(); } // 单独提取加载用户信息的方法 private void loadStudentDetails() { // 使用try-with-resources自动关闭资源 try (Connection conn = ConnectionDatabase.DbConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM student WHERE RegNO = ?")) { // 参数绑定避免SQL注入 ps.setString(1, loggedInRegNO); System.out.println("Login is: " + loggedInRegNO); try (ResultSet rs = ps.executeQuery()) { if(rs.next()) { String fullName = rs.getString("FullName"); String regNO = rs.getString("RegNO"); studentNameLbl.setText(fullName); regNumberLbl.setText(regNO); } else { JOptionPane.showMessageDialog(null, "未找到该用户信息"); } } } catch (Exception e) { // 打印异常便于调试 e.printStackTrace(); JOptionPane.showMessageDialog(null, "加载用户信息失败:" + e.getMessage()); } }
内容的提问来源于stack exchange,提问作者Shem Tom
相关产品推荐
相关产品推荐

