Java案例如何实现用户登录逻辑?

wen java案例 20

本文目录导读:

Java案例如何实现用户登录逻辑?

  1. 基础版:简单验证登录
  2. 面向对象版:封装登录逻辑
  3. 带验证码的登录系统
  4. 加密密码版(MD5加密)
  5. 完整的MVC登录系统
  6. 实际项目中常见的登录处理

我来为你详细讲解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);
    }
}

实现用户登录逻辑时的关键点:

  1. 安全性:密码不要明文存储,使用加密算法
  2. 验证机制:增加验证码防止暴力破解
  3. 错误处理:适当的错误提示,但不要暴露具体信息
  4. 会话管理:登录成功后管理用户会话
  5. 日志记录:记录登录行为用于安全审计
  6. 输入验证:防止SQL注入等安全问题

根据实际项目需求选择合适的实现方式,建议在生产环境中使用成熟的框架(如Spring Security)来处理登录认证。

抱歉,评论功能暂时关闭!