本文目录导读:

我来为你详细讲解Java中实现用户登录逻辑的完整案例,包括多种常见实现方式。
基础版:简单验证登录
import java.util.Scanner;
public class SimpleLogin {
// 模拟数据库中的用户信息
private static final String USERNAME = "admin";
private static final String PASSWORD = "123456";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
// 验证登录
if (USERNAME.equals(username) && PASSWORD.equals(password)) {
System.out.println("登录成功!欢迎回来," + username);
} else {
System.out.println("登录失败:用户名或密码错误");
}
scanner.close();
}
}
面向对象版:封装登录逻辑
// 用户实体类
class User {
private String username;
private String password;
private String role;
public User(String username, String password, String role) {
this.username = username;
this.password = password;
this.role = role;
}
public String getUsername() { return username; }
public String getPassword() { return password; }
public String getRole() { return role; }
}
// 用户服务类
class UserService {
private Map<String, User> userDatabase;
public UserService() {
userDatabase = new HashMap<>();
// 初始化测试用户
userDatabase.put("admin", new User("admin", "123456", "ADMIN"));
userDatabase.put("user1", new User("user1", "password1", "USER"));
userDatabase.put("user2", new User("user2", "password2", "USER"));
}
// 登录验证
public User login(String username, String password) {
// 检查用户名是否存在
User user = userDatabase.get(username);
if (user == null) {
return null; // 用户不存在
}
// 验证密码
if (!user.getPassword().equals(password)) {
return null; // 密码错误
}
return user; // 登录成功
}
}
// 主程序
public class OOPLogin {
public static void main(String[] args) {
UserService userService = new UserService();
Scanner scanner = new Scanner(System.in);
System.out.println("=== 用户登录系统 ===");
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
// 执行登录
User user = userService.login(username, password);
if (user != null) {
System.out.println("登录成功!");
System.out.println("用户:" + user.getUsername());
System.out.println("角色:" + user.getRole());
} else {
System.out.println("登录失败:用户名或密码错误");
}
scanner.close();
}
}
带验证码的登录系统
import java.util.Random;
public class LoginWithCaptcha {
private static final Map<String, String> userDB = new HashMap<>();
private static final int MAX_ATTEMPTS = 3;
private static int attemptCount = 0;
static {
// 初始化用户数据
userDB.put("admin", "123456");
userDB.put("user", "abc123");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (attemptCount < MAX_ATTEMPTS) {
System.out.println("\n=== 登录系统(剩余尝试次数:" + (MAX_ATTEMPTS - attemptCount) + ")===");
// 生成验证码
String captcha = generateCaptcha();
System.out.println("验证码:" + captcha);
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
System.out.print("请输入验证码:");
String inputCaptcha = scanner.nextLine();
// 验证验证码
if (!captcha.equalsIgnoreCase(inputCaptcha)) {
System.out.println("验证码错误!");
continue;
}
// 验证用户名密码
String storedPassword = userDB.get(username);
if (storedPassword != null && storedPassword.equals(password)) {
System.out.println("登录成功!欢迎 " + username);
break;
} else {
System.out.println("用户名或密码错误");
attemptCount++;
}
}
if (attemptCount >= MAX_ATTEMPTS) {
System.out.println("登录失败次数过多,账户已锁定!");
}
scanner.close();
}
// 生成4位数字验证码
private static String generateCaptcha() {
Random random = new Random();
StringBuilder captcha = new StringBuilder();
for (int i = 0; i < 4; i++) {
captcha.append(random.nextInt(10));
}
return captcha.toString();
}
}
加密密码版(MD5加密)
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SecureLogin {
private static final Map<String, String> userDB = new HashMap<>();
static {
// 存储加密后的密码
userDB.put("admin", md5Encrypt("123456"));
userDB.put("user1", md5Encrypt("password123"));
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
// 加密输入的密码
String encryptedPassword = md5Encrypt(password);
// 验证登录
String storedPassword = userDB.get(username);
if (storedPassword != null && storedPassword.equals(encryptedPassword)) {
System.out.println("安全登录成功!");
} else {
System.out.println("登录失败:用户名或密码错误");
}
scanner.close();
}
// MD5加密方法
private static String md5Encrypt(String password) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(password.getBytes());
// 转换为十六进制字符串
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}
完整的MVC登录系统
// 1. Model - 用户模型
class UserModel {
private String username;
private String password;
private String email;
public UserModel(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
// Getters and Setters
public String getUsername() { return username; }
public String getPassword() { return password; }
public String getEmail() { return email; }
}
// 2. View - 用户界面
class LoginView {
private Scanner scanner;
public LoginView() {
scanner = new Scanner(System.in);
}
public String[] getLoginInfo() {
System.out.println("=== 用户登录 ===");
System.out.print("用户名:");
String username = scanner.nextLine();
System.out.print("密码:");
String password = scanner.nextLine();
return new String[]{username, password};
}
public void showSuccess(String username) {
System.out.println("登录成功!欢迎 " + username);
}
public void showError(String message) {
System.out.println("登录失败:" + message);
}
public void showMenu(UserModel user) {
System.out.println("\n=== 主菜单 ===");
System.out.println("1. 查看个人信息");
System.out.println("2. 修改密码");
System.out.println("3. 退出登录");
System.out.print("请选择:");
}
}
// 3. Controller - 登录控制器
class LoginController {
private UserService userService;
private LoginView view;
public LoginController() {
this.userService = new UserService();
this.view = new LoginView();
}
public void processLogin() {
String[] loginInfo = view.getLoginInfo();
String username = loginInfo[0];
String password = loginInfo[1];
// 数据验证
if (username.isEmpty() || password.isEmpty()) {
view.showError("用户名和密码不能为空");
return;
}
// 执行登录
UserModel user = userService.authenticate(username, password);
if (user != null) {
view.showSuccess(username);
showUserMenu(user);
} else {
view.showError("用户名或密码错误");
}
}
private void showUserMenu(UserModel user) {
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
view.showMenu(user);
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.println("用户名:" + user.getUsername());
System.out.println("邮箱:" + user.getEmail());
break;
case 2:
System.out.println("功能开发中...");
break;
case 3:
running = false;
System.out.println("已退出登录");
break;
default:
System.out.println("无效选择");
}
}
}
}
// 4. 用户服务
class UserService {
private Map<String, UserModel> users;
public UserService() {
users = new HashMap<>();
// 初始化测试数据
users.put("admin", new UserModel("admin", "123456", "admin@example.com"));
users.put("test", new UserModel("test", "abc123", "test@example.com"));
}
public UserModel authenticate(String username, String password) {
UserModel user = users.get(username);
if (user != null && user.getPassword().equals(password)) {
return user;
}
return null;
}
}
// 5. 主程序入口
public class MVCLoginSystem {
public static void main(String[] args) {
LoginController controller = new LoginController();
controller.processLogin();
}
}
实际项目中常见的登录处理
// 实际的Web项目登录逻辑示例
public class LoginHandler {
// 登录业务逻辑
public Result login(String username, String password, HttpSession session) {
// 1. 参数校验
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
return Result.error("用户名或密码不能为空");
}
// 2. 查询用户
User user = userDao.findByUsername(username);
if (user == null) {
return Result.error("用户不存在");
}
// 3. 验证密码(实际项目中密码已加密存储)
if (!passwordEncoder.matches(password, user.getPassword())) {
// 记录登录失败
loginLogDao.save(new LoginLog(username, "FAILED"));
return Result.error("密码错误");
}
// 4. 检查账户状态
if (user.getStatus() != 1) {
return Result.error("账户已被禁用");
}
// 5. 生成Token/Session
String token = generateToken(user);
session.setAttribute("user", user);
session.setAttribute("token", token);
// 6. 记录登录日志
loginLogDao.save(new LoginLog(username, "SUCCESS"));
// 7. 返回登录成功
return Result.success(token, user);
}
}
实现用户登录逻辑时的关键点:
- 安全性:密码不要明文存储,使用加密算法
- 验证机制:增加验证码防止暴力破解
- 错误处理:适当的错误提示,但不要暴露具体信息
- 会话管理:登录成功后管理用户会话
- 日志记录:记录登录行为用于安全审计
- 输入验证:防止SQL注入等安全问题
根据实际项目需求选择合适的实现方式,建议在生产环境中使用成熟的框架(如Spring Security)来处理登录认证。