上一篇
为简单Java注册登录示例代码:用Scanner接收输入,存用户名密码到Map,登录时校验匹配与否。,“
java,import java.util.;,class Main{, public static void main(String[] args){, Map users = new HashMap();, Scanner sc = new Scanner(System.in);, System.out.print("请输入用户名:");, String uname = sc.nextLine();, System.out.print("请输入密码:");, String upwd = sc.nextLine();, users.put(uname, upwd);, System.out.print("登录用户名:");, String lname = sc.nextLine();, System.out.print("登录密码:");, String lpwd = sc.nextLine();, if(users.containsKey(lname)&&users.get(lname).equals(lpwd)), System.out.println("登录成功!");, else, System.out.println("登录失败!");, },},“
核心设计思路
- 数据结构:使用
HashMap临时存储用户信息(键为用户名,值为密码) - 功能模块:分为注册、登录两大主要功能
- 异常处理:包括重复用户名检测、输入有效性校验等基础验证机制
- 扩展性考虑:虽然采用内存存储,但结构设计便于后续替换为数据库持久化方案
完整实现代码及解析
User类(数据模型)
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
// Getter方法用于获取属性值
public String getUsername() { return username; }
public String getPassword() { return password; }
}
说明:封装用户基本信息,遵循JavaBean规范以便后续扩展,实际项目中建议添加加密字段存储盐值等信息。
AuthService认证服务类
import java.util.HashMap;
import java.util.Map;
public class AuthService {
private Map<String, User> userDatabase = new HashMap<>(); // 模拟数据库表
// 注册方法:返回是否成功
public boolean register(String username, String password) {
if (userExists(username)) {
System.out.println("[错误] 该用户名已被占用");
return false;
}
userDatabase.put(username, new User(username, password));
System.out.println(" 注册成功!");
return true;
}
// 登录验证:返回布尔型结果
public boolean login(String username, String password) {
User foundUser = userDatabase.get(username);
if (foundUser == null) {
System.out.println(" 用户不存在");
return false;
}
if (!foundUser.getPassword().equals(password)) {
System.out.println("️ 密码错误");
return false;
}
System.out.println(" 登录成功!欢迎回来 " + username);
return true;
}
// 辅助方法:检查用户名是否存在
private boolean userExists(String username) {
return userDatabase.containsKey(username);
}
}
关键点:①线程安全问题可通过改用ConcurrentHashMap解决;②密码应存储哈希值而非明文(生产环境必须)。
⌨️ Main主程序入口
import java.util.Scanner;
public class MainApplication {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
AuthService authSystem = new AuthService();
while (true) {
System.out.println("n===== 请选择操作 =====");
System.out.println("1. 注册新账号");
System.out.println("2. 登录已有账号");
System.out.println("3. 退出系统");
System.out.print("→ 输入选项数字: ");
try {
int choice = Integer.parseInt(scanner.nextLine());
switch (choice) {
case 1 -> handleRegistration(scanner, authSystem);
case 2 -> handleLogin(scanner, authSystem);
case 3 -> { System.out.println(" 再见!"); return; }
default -> System.out.println("无效选项,请重新输入");
}
} catch (NumberFormatException e) {
System.out.println("️ 请输入有效的数字选项");
}
}
}
private static void handleRegistration(Scanner scanner, AuthService service) {
System.out.print("设置您的用户名: ");
String uname = scanner.nextLine().trim();
System.out.print("设置您的密码: ");
String pwd = scanner.nextLine().trim();
service.register(uname, pwd);
}
private static void handleLogin(Scanner scanner, AuthService service) {
System.out.print("输入用户名: ");
String uname = scanner.nextLine().trim();
System.out.print("输入密码: ");
String pwd = scanner.nextLine().trim();
service.login(uname, pwd);
}
}
交互特点:①支持连续多次尝试;②友好的提示信息引导用户操作;③异常捕获保证程序稳定性。
执行流程演示(典型场景)
| 步骤 | 用户输入 | 系统响应 | 备注 |
|---|---|---|---|
| t=0s | [选择1] | 进入注册流程 | |
| t=5s | test_user / pass123 | 注册成功! | 新建有效账户 |
| t=8s | [选择2] → test_user/wrongpass | ️ 密码错误 | 容错机制生效 |
| t=12s | [选择2] → test_user/pass123 | 登录成功! | 正确凭证通过验证 |
| t=15s | [选择3] | 再见! | 正常退出循环 |
FAQs常见问题解答
Q1: 这个示例中的密码为什么用明文保存?这样安全吗?
A: 这是教学演示用的简化方案,真实项目应当使用BCrypt等算法对密码进行哈希加盐处理,例如通过Spring Security框架实现的安全编码实践,本例重点展示基础逻辑流程,安全性不是主要考量因素。
Q2: 如果改成图形界面需要哪些调整?
A: 可将控制台输入改为Swing组件(JTextField+JPasswordField),事件监听器替代Scanner读取逻辑,核心认证逻辑保持不变,只需重构UI层即可实现GUI版本,推荐使用MVC模式分离
