如何将Spring项目登录页面与Oracle数据库关联实现登录验证
Spring Web应用登录验证实现方案(关联Oracle数据库)
需求说明
我正在开发一个基于Spring的Web应用,技术栈包含HTML、Java和Oracle数据库。现有一个登录HTML页面,需要和数据库关联,仅当输入的用户名和密码存在于USER表中时,才允许访问应用。
现有登录页面代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Iniciosesion</title> </head> <body> <center> <img src="Imagenes%20de%20inicio/icono.png"> <h2>Usuario</h2> <input type ="text" name = "username"> <h2>Contraseña</h2> <input type ="text" name = "password"> <a href="index.html"><input type="button" value="Ir"></a> <form action="Coger_datos" method="post"> <input type="submit" value="Ir"> </form> <a href="usuario/add.html"><input type="button" value="Crear cuenta"></a> </center> </body> </html>
现有数据库访问代码
package es.uma.ingsoftware.goldendumbbell.Controller; import java.sql.*; public class Coger_datos { public static void main(String args[]) throws SQLException { System.out.println("\nEstableciendo conexión..."); Connection con = DriverManager.getConnection("zzzzz", "xxxxxx", "yyyyy"); System.out.println("Conexión establecida\n"); Statement stmt = con.createStatement(); String consulta = "SELECT CONTRASEÑA FROM USUARIO where usuario.nombre = 'javimp2003'"; System.out.println("Se va a ejecutar la consulta: " + consulta); System.out.println("\nIniciando transacción..."); ResultSet rset = stmt.executeQuery(consulta); System.out.println("Resultado de la consulta:"); while (rset.next()) { int ncol = rset.getMetaData().getColumnCount(); for (int i = 1; i <= ncol; i++) { // for: Itera sobre las columnas de la fila System.out.print(rset.getString(i)); if (i < ncol) System.out.print(" | "); } System.out.println(); } System.out.println("Finalizando transacción..."); stmt.close(); con.close(); System.out.println("\nConexión finalizada"); } }
登录页面预览

完整实现步骤
1. 修复HTML登录表单
现有表单存在输入框不在<form>内的问题,导致提交时无法携带用户名和密码。修改后的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Iniciosesion</title> </head> <body> <center> <img src="Imagenes%20de%20inicio/icono.png"> <h2>Usuario</h2> <form action="/login" method="post"> <input type="text" name="username" placeholder="输入用户名"> <h2>Contraseña</h2> <input type="password" name="password" placeholder="输入密码"> <input type="submit" value="登录"> </form> <a href="usuario/add.html"><input type="button" value="Crear cuenta"></a> </center> </body> </html>
关键调整:
- 所有输入控件移入
<form>标签内,确保参数能正常传递 - 密码输入框改用
type="password",避免明文显示 - 调整表单
action为Spring控制器的映射路径/login
2. 改造Spring登录控制器
替换原有Coger_datos类,编写符合Spring规范的控制器,处理登录请求并验证数据库:
package es.uma.ingsoftware.goldendumbbell.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; @Controller public class LoginController { // 数据库连接参数,建议移至application.properties配置文件 private static final String DB_URL = "jdbc:oracle:thin:@//你的数据库地址:端口/服务名"; private static final String DB_USER = "数据库用户名"; private static final String DB_PWD = "数据库密码"; @PostMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password) { try { // 加载Oracle驱动(Oracle 12c+可自动加载,保留兼容写法) Class.forName("oracle.jdbc.driver.OracleDriver"); // 使用try-with-resources自动关闭资源,避免内存泄漏 try (Connection con = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD); PreparedStatement pstmt = con.prepareStatement( "SELECT CONTRASEÑA FROM USUARIO WHERE nombre = ?")) { pstmt.setString(1, username); ResultSet rset = pstmt.executeQuery(); // 验证用户存在性及密码匹配 if (rset.next()) { String dbPassword = rset.getString("CONTRASEÑA"); if (password.equals(dbPassword)) { // 验证成功,跳转至首页 return "redirect:/index.html"; } } // 验证失败,返回登录页并携带错误标识 return "redirect:/login.html?error=1"; } } catch (Exception e) { e.printStackTrace(); // 异常情况返回登录页 return "redirect:/login.html?error=2"; } } }
关键调整:
- 使用
@Controller标记Spring控制器类,用@PostMapping映射POST请求 - 采用
PreparedStatement替代Statement,防止SQL注入攻击 - 自动管理数据库连接资源,避免手动关闭遗漏
- 明确验证逻辑:查询用户密码并对比,根据结果跳转页面
3. 安全优化建议
- 密码加密存储:禁止明文存储密码,使用BCrypt等哈希算法加密后存入数据库,验证时对输入密码加密再对比
- 配置文件管理:数据库连接参数移至
application.properties,避免硬编码泄露敏感信息 - 日志替代打印:用SLF4J+Logback等日志框架记录异常,而非直接打印堆栈信息
- Spring Security集成:推荐使用Spring Security框架,自动处理登录会话、权限控制等功能,简化开发流程
内容的提问来源于stack exchange,提问作者xxjmpxx__
相关产品推荐
相关产品推荐

