You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:55:22