我有一个用户登录的GUI。
首先,用户创建自己的帐户,该信息存储在.txt
文件中。我使用PrintWriter
在该文件中附加详细信息。
使用分隔符存储详细信息。我可以从文件中轻松阅读用户的每个细节。
在登录界面中,我在JTtextField
中有2个JFrame
个组件,第一个是用户名,第二个是密码。
我使用getText方法获取值:
String user = user.getText();
String password = password.getText();
我尝试使用BufferedReader
,但我无法让它工作:
if(user.equals(br.readline))
我想要做的是扫描文件,如果文件中的任何内容等于用户名(来自框架上用户的getText),那么我想使用SetVisible转到下一帧
我的问题是,即使是错误的密码和用户,也会转到新框架
我该如何解决?
在StackOverflow上在线查找的用户和密码检查代码现在仍在使用。
Scanner sc = new Scanner(new File("Details.txt"));
while(sc.hasNextLine()) {
int val =0;
String line = sc.nextLine();
if(line.indexOf(user) !=-1 && line.indexOf(pass) !=-1) {
JOptionPane.showMessageDialog(null,"Login");
val = 1;
vf.setVisible(true);
break;
} else {
JOptionPane.showMessageDialog(null,"Invalid");
val = 0;
break;
}
}
另一个用于for的代码,即使在do while循环中,仍然无效。
File file = new File("Details.txt");
BufferedReader br = new BufferedReader(new FileReader("Details.txt"));
String Line;
do{
if(user.equals(br.readLine()) && pass.equals(br.readLine())){
vf.setVisible(true);
} else {
JOptionPane.showMessageDialog(null,"Invalid");
}
}while((Line=br.readLine()) !=null )
这是用户详细信息存储在我的文件中的方式。
=======================
=======================
First Name = Ahmed Ali
Last Name = Qazi
Address = Al-Abbass Colony pHase 2
Phone Number = +92032329301
Email Address = ahmedrider56@gmail.com
UserName = ahmedfirst67
Password = dangerd = 2hg
=======================
=======================
=======================
=======================
First Name = Ahm345
Last Name = Qa345
Address = Al-asfafs
Phone Number = +92032329301
Email Address = ahmgsdg
UserName = ahmegg
Password = dagg
答案 0 :(得分:1)
根据您的文件结构,这不是直截了当的,但您可以这样做:
以下是代码:
private static boolean checkCredentials(String user, String pass) throws IOException {
Scanner sc = new Scanner(new File("Details.txt"));
boolean userFound = false;
String correctPassword = null;
String line;
while(sc.hasNextLine()) {
line = sc.nextLine();
// find the user
if(!userFound) {
userFound = line.contains("UserName = "+user);
} else {
// find the password
if(line.contains("Password = ")) {
correctPassword = line.substring(line.indexOf("=") + 2);
break;
}
}
}
return correctPassword!=null && correctPassword.equals(pass);
}
public static void main(String[] args) throws IOException {
System.out.println(checkCredentials("Bob", "dagg"));
System.out.println(checkCredentials("ahmegg", "daggy"));
System.out.println(checkCredentials("ahmegg", "dagg"));
}
打印:
false
false
true
将它贴在你的代码中:
val = 0;
String message = "Invalid";
if(checkCredentials(user, pass)) {
message = "Login";
val = 1;
vf.setVisible(true);
}
JOptionPane.showMessageDialog(null, message);
注意:强>
如果以这种方式将详细信息存储在一行上会更容易:
Ahmed Ali|Qazi|Al-Abbass Colony pHase 2|+92032329301|ahmedrider56@gmail.com|ahmedfirst67|dangerd = 2hg
Ahm345|Qa345|Al-asfafs|+92032329301|ahmgsdg|ahmegg|dagg
您可以使用String.split
方法解析每一行并同时获取用户和密码。
注2:
将密码未加密存储也是非常糟糕的做法。如果这是一个学校练习,那很好,但如果是真实生活项目,你可能想看看加密文件中的密码。