以下是一个简单的JavaWeb登录注册页面的完整代码示例:

index.jsp:

<!DOCTYPE html>
<html>
<head>
 <title>Login and Registration</title>
</head>
<body>
 <h2>Login</h2>
 <form action="login" method="post">
 <label for="username">Username:</label>
 <input type="text" id="username" name="username" required><br><br>
 
 <label for="password">Password:</label>
 <input type="password" id="password" name="password" required><br><br>
 
 <input type="submit" value="Login">
 </form>
 
 <h2>Register</h2>
 <form action="register" method="post">
 <label for="username">Username:</label>
 <input type="text" id="username" name="username" required><br><br>
 
 <label for="password">Password:</label>
 <input type="password" id="password" name="password" required><br><br>
 
 <input type="submit" value="Register">
 </form>
</body>
</html>

LoginServlet.java:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 String username = request.getParameter("username");
 String password = request.getParameter("password");
 
 if (username.equals("admin") && password.equals("admin")) {
 response.sendRedirect("success.jsp");
 } else {
 response.sendRedirect("failure.jsp");
 }
 }
}

RegisterServlet.java:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 String username = request.getParameter("username");
 String password = request.getParameter("password");
 
 if (username != null && !username.trim().isEmpty() && password != null && !password.trim().isEmpty()) {
 response.sendRedirect("success_register.jsp");
 } else {
 response.sendRedirect("failure_register.jsp");
 }
 }
}

failure.jsp:

<!DOCTYPE html>
<html>
<head>
 <title>Failure</title>
</head>
<body>
 <h1>Login/Registration Failed!</h1>
</body>
</html>

这是一个简单的示例,其中包含了一个index.jsp页面,该页面显示了登录和注册表单,并将数据提交给LoginServlet和RegisterServlet进行处理。如果登录或注册成功,将重定向到success.jsp页面;否则,将重定向到failure.jsp页面。注意,在实际开发中,你需要更复杂的逻辑和安全性来验证用户名和密码,并处理数据持久化。此示例仅用于演示目的。

当然,让我们继续完善这个示例。

添加用户验证

我们可以在RegisterServlet中添加更多的验证,例如检查用户名是否已经存在,密码是否满足最小长度和复杂度等。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if (username == null || password == null) {
            response.sendRedirect("failure.jsp?message=Please%20fill%20out%20all%20the%20fields");
            return;
        }
        
        // Check if the username already exists.
        if (usernameExists(username)) {
            response.sendRedirect("failure.jsp?message=Username%20already%20exists");
            return;
        }
        
        // Check if the password meets the criteria (min length, complexity).
        if (!passwordMeetsCriteria(password)) {
            response.sendRedirect("failure.jsp?message=Password%20does%20not%20meet%20the%20requirements");
            return;
        }
        
        // Save the user information to the database.
        // ...
        
        response.sendRedirect("success.jsp");
    }
    
    private boolean usernameExists(String username) {
        // Implement your logic here to check if the username already exists in the database.
        // You can use a Data Access Object (DAO) or a service layer to perform this operation.
        return false; // Placeholder logic.
    }
    
    private boolean passwordMeetsCriteria(String password) {
        // Implement your logic here to check if the password meets the required criteria.
        // You can define your own rules for password complexity and minimum length.
        return false; // Placeholder logic.
    }
}

添加错误消息传递

failure.jsp中,我们可以通过查询字符串参数来传递错误消息,然后在页面上显示它。

failure.jsp

<!DOCTYPE html>
<html>
<head>
 <title>Failure</title>
</head>
<body>
 <h1>Login/Registration Failed!</h1>
 <p>${message}</p> <!-- Here we read the message from the query string and display it. -->
</body>
</html>

以上示例仅为基础示例,真实的Web开发通常涉及更多的安全性和错误处理机制,还需要处理更多的边界情况和细节。希望这个基础示例对你有所帮助!

添加密码加密

在保存用户密码时,我们应该使用加密算法来保护用户密码的安全性。我们可以使用Java的内置加密库或第三方库如bcrypt来加密密码。

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {
    // ...
    
    private boolean passwordMeetsCriteria(String password) {
        // Check if the password length is at least 8 characters.
        if (password.length() < 8) {
            return false;
        }
        
        // Check if the password contains at least one uppercase letter, one lowercase letter, and one digit.
        boolean hasUppercase = false, hasLowercase = false, hasDigit = false;
        for (char c : password.toCharArray()) {
            if (Character.isUpperCase(c)) {
                hasUppercase = true;
            } else if (Character.isLowerCase(c)) {
                hasLowercase = true;
            } else if (Character.isDigit(c)) {
                hasDigit = true;
            }
        }
        
        return hasUppercase && hasLowercase && hasDigit;
    }
    
    private String encryptPassword(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(password.getBytes(StandardCharsets.UTF_8));
            StringBuilder sb = new StringBuilder();
            for (byte b : hash) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
    
    private boolean usernameExists(String username) {
        // Implement your logic here to check if the username already exists in the database.
        // You can use a Data Access Object (DAO) or a service layer to perform this operation.
        return false;
    }
}

添加密码加密(使用bcrypt)

使用bcrypt库可以更安全地加密密码。首先,你需要将bcrypt库添加到项目的依赖中。然后,可以使用BCryptPasswordEncoder类来对密码进行加密和解密。

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoderBuilder;

public class RegisterServlet extends HttpServlet {
    // ...
    
    private boolean passwordMeetsCriteria(String password) {
        // Check if the password length is at least 8 characters.
        if (password.length() < 8) {
            return false;
        }
        
        // Check if the password contains at least one uppercase letter, one lowercase letter, and one digit.
        boolean hasUppercase = false, hasLowercase = false, hasDigit = false;
        for (char c : password.toCharArray()) {
            if (Character.isUpperCase(c)) {
                hasUppercase = true;
            } else if (Character.isLowerCase(c)) {
                hasLowercase = true;
            } else if (Character.isDigit(c)) {
                hasDigit = true;
            }
        }
        
        return hasUppercase && hasLowercase && hasDigit;
    }
    
    private String encryptPassword(String password) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoderBuilder().build();
        return passwordEncoder.encode(password);
    }
    
    // ...
}

现在,让我们完善success.jspfailure.jsp

success.jsp

当注册成功时,显示成功消息和欢迎信息。

<!DOCTYPE html>
<html>
<head>
 <title>Success</title>
</head>
<body>
 <h1>Registration Successful!</h1>
 <p>Welcome, ${username}! You can now log in.</p>
</body>
</html>

failure.jsp

当注册失败时,显示失败消息和错误信息。

<!DOCTYPE html>
<html>
<head>
 <title>Failure</title>
</head>
<body>
 <h1>Registration Failed!</h1>
 <p>Error message: ${message}</p>
</body>
</html>
11-22 12:04