Android Studio中JDBC连接SQL Server登录验证异常求助
问题分析与解决
你的代码核心问题是无论查询结果是否存在匹配用户,都会执行页面跳转——执行完executeQuery后,没有判断ResultSet是否包含有效数据,直接调用了startActivity,所以不管输入什么都会登录成功。
修复步骤及代码优化
1. 增加登录验证判断
通过resultSet.next()判断是否存在匹配的用户名和密码:
- 如果
resultSet.next()返回true,说明数据库中存在该用户,执行跳转 - 如果返回
false,弹出错误提示框
2. 替换Statement为PreparedStatement(解决SQL注入风险)
原代码用字符串拼接SQL语句存在严重的SQL注入漏洞,必须改用PreparedStatement预编译语句。
3. 完善资源关闭(避免内存泄漏)
查询完成后,要依次关闭ResultSet、PreparedStatement和Connection资源。
修改后的完整代码:
try { Connection mainconn = connection(); if (mainconn != null) { // 使用PreparedStatement预编译SQL,避免SQL注入 String sqlquery = "Select Id from tblLogin where username = ? and password = ?"; PreparedStatement pst = mainconn.prepareStatement(sqlquery); // 设置参数,索引从1开始 pst.setString(1, edUsername.getText().toString().trim()); pst.setString(2, edPassword.getText().toString().trim()); ResultSet resultSet = pst.executeQuery(); if (resultSet.next()) { // 存在匹配用户,获取ID并跳转 Id = resultSet.getString("Id"); startActivity(new Intent(MainActivity.this, MainMenu.class)); finish(); } else { // 无匹配用户,弹出错误提示 runOnUiThread(() -> { new AlertDialog.Builder(MainActivity.this) .setTitle("Login Failed") .setMessage("Incorrect username or password") .setPositiveButton("OK", null) .show(); }); } // 关闭资源 resultSet.close(); pst.close(); mainconn.close(); } } catch (Exception ex) { Log.e("Error", ex.getMessage()); // 捕获异常时也可弹出提示 runOnUiThread(() -> { new AlertDialog.Builder(MainActivity.this) .setTitle("Error") .setMessage("Login failed due to an error: " + ex.getMessage()) .setPositiveButton("OK", null) .show(); }); }
额外说明
- 调用
runOnUiThread是因为数据库操作通常在子线程执行,UI操作必须在主线程完成 - 密码建议不要明文存储,应该在数据库中存储加密后的密码(比如BCrypt等),登录时对输入的密码加密后再和数据库中的值对比
内容的提问来源于stack exchange,提问作者user21834984
相关产品推荐
相关产品推荐

