Java中如何关联含Scanner变量的SignUp与LogIn类实现账号密码校验
我正在实现包含用户名、密码校验的SignUp和LogIn功能,两个功能分别写在独立的Java类中。
我不清楚如何关联这两个类,希望注册时录入的用户名、密码可与登录时的输入做一致性匹配。
SignUp类代码
import java.util.*; public class SignUp { Scanner input = new Scanner(System.in); public static String username; public static String password; public void vars(String username, String password) { this.username = username; this.password = password; } public void usernameMethod() { Scanner input = new Scanner(System.in); System.out.println("Your Username:"); username = input.next(); } public void passMethod() { System.out.println("Your Password:"); password = input.next(); } public static void main(String[] args) { System.out.print("SIGN UP\n\n"); SignUp Adam = new SignUp(); Adam.vars(username, password); Adam.usernameMethod(); Adam.passMethod(); System.out.println("Signed Up Successfully!"); } }
LogIn类代码
import java.util.*; public class LogIn { public static void main(String[] args) { String username2 = null; String password2 = null; Scanner input = new Scanner(System.in); SignUp signUp = new SignUp(); signUp.vars(username2, password2); System.out.println("Your Username:"); username2 = input.next(); while (!username2.contentEquals(SignUp.username)) { System.out.print("That doesn't match our records! Try again."); username2 = input.next(); } if (username2.contentEquals(SignUp.username)) { System.out.print("Your Password:"); password2 = input.next(); if (password2.contentEquals(SignUp.password)) { System.out.print("Enjoy the Game!"); } } } }
问题原因
你当前的实现逻辑问题出在:SignUp类的username、password是静态成员变量,仅在当前JVM进程的运行周期内有效。如果分别运行SignUp和LogIn的main方法,相当于启动了两个完全独立的JVM进程,注册生成的账号数据会随着SignUp进程结束直接销毁,LogIn进程自然无法读取到之前的注册数据。
修复方案
方案1:统一程序入口(适合本地简单测试)
不要分开运行两个main方法,新增一个统一启动类,先执行注册流程,再执行登录流程,两个类共享同一个JVM的静态变量,数据即可正常互通。
新增启动类代码:
public class AppStarter { public static void main(String[] args) { // 先触发注册 SignUp signUp = new SignUp(); System.out.print("SIGN UP\n\n"); signUp.usernameMethod(); signUp.passMethod(); System.out.println("Signed Up Successfully!\n"); // 再触发登录 LogIn login = new LogIn(); login.checkLogin(); } }
调整LogIn类,把登录逻辑封装为普通方法,移除自有main方法:
import java.util.*; public class LogIn { public void checkLogin() { String inputUsername; String inputPassword; Scanner input = new Scanner(System.in); System.out.println("LOG IN\n"); System.out.println("Your Username:"); inputUsername = input.next(); while (!inputUsername.equals(SignUp.username)) { System.out.print("That doesn't match our records! Try again:"); inputUsername = input.next(); } System.out.print("Your Password:"); inputPassword = input.next(); if (inputPassword.equals(SignUp.password)) { System.out.print("Enjoy the Game!"); } else { System.out.print("Wrong password, login failed."); } } }
方案2:持久化存储数据(适合正式使用场景)
如果需要关闭程序后下次打开仍能使用之前注册的账号,就把注册生成的用户名密码写入本地文件、内存数据库或者关系型数据库,登录时直接从存储介质读取数据做校验即可。
优化建议
- 不要用静态变量存储用户敏感信息,后续如果要支持多用户注册,可以改用
Map<String, String>集合存储多组账号密码 - 全局复用一个
Scanner实例即可,不需要重复创建 - 输入密码时可以关闭控制台回显,避免密码明文泄露
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

