java连接数据库,用户的密码必须加密存储在数据库中

在以下代码中进行注册操作时,连接数据库对比注册邮箱和密码,如果数据库已存在相同邮箱则提示“邮箱已注册”,否则将新的用户信息写入webUser表中,这个功能一直都实现不了,代码菜鸟急需大佬求助
登录页面(login.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<style type="text/css">
body {
    background-image: url("11.jpg");
    background-repeat: no-repeat;
    background-size: cover;
    background-color: #f2f2f2;
    font-family: Arial, sans-serif;
}

h1 {
    text-align: center;
    color: #333;
}

form {
    margin: 0 auto;
    width: 400px;
    padding: 20px;
    background-color: rgba(255, 255, 255, 0.5);
    border-radius: 5px;
    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
}

label, input, button, select, option {
    display: block;
    margin-bottom: 10px;
}

label {
    font-weight: bold;
}

input[type="email"], input[type="password"] {
    width: 100%;
    padding: 5px;
    border-radius: 3px;
    border: none;
    box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
}

input[type="submit"] {
    background-color: #4CAF50;
    color: #fff;
    padding: 10px;
    border-radius: 5px;
    border: none;
    cursor: pointer;
    transition: background-color ease-in-out 0.3s;
    box-shadow: inset 0px 1px rgba(255, 255, 255, 0.6), inset 0px 1px
        rgba(255, 255, 255, 0.6);
}

input[type="submit"]:hover {
    background-color: #3e8e41
}
</style>
</head>
<body>
    <h1>教务系统登录</h1>
    <form action="login" method="post">
        <label for="email">登录邮箱:</label> <input type="email" id="email"
            name="email" required><br> <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br>
        <input type="submit" value="登录"> <a href="register.jsp">注册</a>
    </form>
    <script>
        function login() {
            var email = document.getElementById("email").value;
            var password = document.getElementById("password").value;
            alert("登录成功");
            window.location.href = "data.jsp";
        }
    </script>
</body>
</html>




注册页面(register.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<style>
body {
    background-image: url("11.jpg");
    background-repeat: no-repeat;
    background-size: cover;
    background-color: #f2f2f2;
    font-family: Arial, sans-serif;
}

.register-container {
    text-align: center; /* 添加此属性使文本居中显示 */
    border: 1px solid gray;
    padding: 20px;
    background-color: rgba(255, 255, 255, 0.5);
    box-shadow: 0px 0px 5px gray;
    margin: 0 auto;
    margin-top: 100px;
    max-width: 400px;
}

.register-container h2 {
    margin: 0 auto;
}

}
.input-group {
    display: inline-block;
    margin-bottom: 15px;
}

.input-group label {
    font-weight: bold;
    margin-bottom: 5px;
}

.input-group input {
    width: 200px;
    height: 30px;
    padding: 5px;
    font-size: 16px;
    border: 1px solid gray; /* 添加输入框的边框 */
    border-radius: 5px; /* 设置输入框的圆角 */
    margin-bottom: 10px; /* 添加输入框之间的间距 */
}

}
.register-btn {
    padding: 10px;
    background-color: red; /* 将背景颜色设置为红色 */
    color: white;
    border: none;
    cursor: pointer;
    font-size: 16px;
}

</style>
</head>
<body>
    <div class="register-container">
        <h2>注册</h2>
        <div class="input-group">
            <label for="userName">用户名:</label> <input type="text" id="userName"
                required>
        </div>
        <div class="input-group">
            <label for="email">邮箱:</label> <input type="email" id="email"
                required>
        </div>
        <div class="input-group">
            <label for="password">密码:</label> <input type="password"
                id="password" required>
        </div>
        <button class="register-btn" onclick="register()">注册</button>
    </div>

    <script>
        function register() {
            var userName = document.getElementById("userName").value;
            var email = document.getElementById("email").value;
            var password = document.getElementById("password").value;

            // 示例代码:弹出注册成功的窗口,并跳转到登录页面
            alert("注册成功!");
            window.location.href = "login.jsp?email=" + email + "&password="
                    + password; // 登录页面的路径,并传递邮箱和密码参数
        }
    </script>
</body>
</html>


数据展示页面(data.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%!boolean userIsLoggedIn = true;%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据展示页面</title>
<style type="text/css">
h1 {
    text-align: center;
}

table {
    margin: 0 auto;
}
</style>
</head>
<body>
    <h1>学生信息表</h1>
    <table border="1">
        <tr>
            <th>系号</th>
            <th>学号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>出生日期</th>
            <th>地址</th>
            <th>民族</th>
            <th>班级</th>
            <th>专业</th>
        </tr>
        <%
        HttpSession localSession = request.getSession();
        String email = (String) session.getAttribute("email");
        String password = (String) session.getAttribute("password");
        // 使用获取到的邮箱和密码进行数据展示或其他操作
        %>
        <%
        try {
            // 在此处添加验证用户是否已登录的代码
            if (userIsLoggedIn) { // 替换为你自己的判断条件
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jwxt", "root", "1234");
                Statement stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT * FROM student");
                while (rs.next()) {
        %>
        <tr>
            <td><%=rs.getString("系号")%></td>
            <td><%=rs.getString("学号")%></td>
            <td><%=rs.getString("姓名")%></td>
            <td><%=rs.getString("性别")%></td>
            <td><%=rs.getString("出生日期")%></td>
            <td><%=rs.getString("地址")%></td>
            <td><%=rs.getString("民族")%></td>
            <td><%=rs.getString("班级")%></td>
            <td><%=rs.getString("专业")%></td>
        </tr>
        <%
        }
        rs.close();
        stmt.close();
        con.close();
        } else {
        // 用户未登录,显示登录提示或跳转到登录页面
        response.sendRedirect("login.jsp"); // 替换为你自己的登录页面路径
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
        %>
    </table>
</body>
</html>




登录操作(Login.java):
package qimo;
import java.io.IOException;
import java.sql.*;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

@WebServlet("/login")
public class Login extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String email = request.getParameter("email");
        String password = request.getParameter("password");

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jwxt", "root", "1234");
            PreparedStatement stmt = con.prepareStatement("SELECT * FROM webUser WHERE email=? AND password=?");
            stmt.setString(1, email);
            stmt.setString(2, password);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                HttpSession session = request.getSession();
                session.setAttribute("email", email);
                session.setAttribute("password", password);

                response.sendRedirect("data.jsp");
            } else {
                response.sendRedirect("login.jsp");
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}




注册操作(Register.java):
package qimo;

import java.io.IOException;
import java.sql.*;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

@WebServlet("/register")
public class Register extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String email = request.getParameter("email");
        String password = request.getParameter("password");

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jwxt", "root", "1234");
            
            // 检查邮箱是否已注册
            PreparedStatement stmt = con.prepareStatement("SELECT * FROM webUser WHERE email = ?");
            stmt.setString(1, email);
            ResultSet rs = stmt.executeQuery();
            
            if (rs.next()) {
                // 邮箱已注册
                response.sendRedirect("register.jsp?error=邮箱已注册");
            } else {
                // 将新用户信息写入数据库
                stmt = con.prepareStatement("INSERT INTO webUser (username, email, password) VALUES (?, ?, ?)");
                stmt.setString(1, username);
                stmt.setString(2, email);
                stmt.setString(3, password);

                int rowsAffected = stmt.executeUpdate();

                if (rowsAffected > 0) {
                    HttpSession session = request.getSession();
                    session.setAttribute("email", email);
                    session.setAttribute("password", password);

                    response.sendRedirect("login.jsp");
                } else {
                    response.sendRedirect("register.jsp?error=注册失败,请重试");
                }
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}





你现在注册是有啥问题? 啥叫没有实现功能?

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/166726
  • 你也可以参考下这篇文章:java对压缩文件进行加密,解压直接输入解密密码来使用
  • 同时,你还可以查看手册:java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-类和对象》描述了如何编写创建对象的类,以及如何创建和使用对象。-课堂 中的内容
  • 除此之外, 这篇博客: java泛型总结中的 不能在泛型类的静态域中使用泛型类型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • public class Singleton<T>{
        private static T singleton; //error
        public static T getInstance(){} //error
        public static void print(T t){} //error
    }

    但是,静态的泛型方法可以使用泛型类型:

    public static <T> T getInstance(){return null;} //ok
    public static <T> void print(T t){} //ok

    这个原因很多资料中都没说的太明白,说一下个人理解,仅供参考:

    1. 泛型类中,<T>称为类型变量,实际上就相当于在类中隐形的定义了一个不可见的成员变量:`private T t;`,这是对象级别的,对于泛型类型变量来说是在对象初始化时才知道其具体类型的。而在静态域中,不需要对象初始化就可以调用,这是矛盾的。
    
    2. 静态的泛型方法,是在方法层面定义的,就是说在调用方法时,T所指的具体类型已经明确了。
  • 您还可以看一下 机工社华章IT老师的Java并发编程课程中的 认识并发软件的偶然复杂性小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的关键点是如何安全地将用户密码加密存储在数据库中。下面是一种解决方案:

    1. 使用哈希算法进行密码加密。哈希算法是一种单向加密算法,意味着无法通过加密后的结果还原出原始密码。常见的哈希算法有MD5、SHA-1、SHA-256等。例如,使用MD5算法对密码进行加密:
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Base64;
    
    public class PasswordUtil {
        public static String encryptPassword(String password) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] hashedPassword = md.digest(password.getBytes());
            return Base64.getEncoder().encodeToString(hashedPassword);
        }
    }
    
    1. 在用户注册或修改密码时,调用加密函数对密码进行加密,并将加密后的密码存储在数据库中:
    String password = "password123";
    String encryptedPassword = PasswordUtil.encryptPassword(password);
    
    // 将encryptedPassword保存到数据库中
    
    1. 在验证用户登录时,对用户输入的密码进行加密并与数据库中的加密密码进行比较:
    String inputPassword = "password123";
    String encryptedInputPassword = PasswordUtil.encryptPassword(inputPassword);
    
    // 从数据库中读取encryptedPassword
    if (encryptedInputPassword.equals(encryptedPasswordFromDatabase)) {
        // 密码正确
    } else {
        // 密码错误
    }
    

    通过使用哈希算法对密码进行加密,即使数据库被恶意获取,也无法还原出用户的原始密码,从而保护用户的密码安全。

    但需要注意的是,单纯的哈希算法仍然有一定的安全风险,因为哈希算法是固定的,相同的原始密码会得到相同的加密结果,容易被破解。对此,可以在哈希算法的基础上加入一些额外的技术措施,如加盐(salt)和迭代次数(iterations),以增加密码的复杂度和安全性。但是,这超出了本问题的范围。

所以现在是什么情况,是提示你报错呢,还是什么问题