我在检查arraylist中的重复项时遇到麻烦。这是有关其工作方式的实际事件顺序:
有没有更有效的方法来检查类与类之间的重复项?非常感谢
解决了
第二个问题:如果存在一串混合的非数字和数字字符,我将无法登录。
方案1(登录失败):登录ID:测试密码:a1s2d3f4
方案2(登录失败):登录ID:a1s2d3f4密码:test
方案2(成功):登录ID:测试密码:测试
方案3(成功):登录ID:asdasd123123密码:asdasd123123
我认为问题在于向量中存储的字符串的长度。如何使矢量中存储的所有数据都具有固定的长度/大小?
解决了
LoginPanel.class
...
else if (e.getSource() == registerB) {
con = new Controller();
String login = loginTF.getText();
String pass = new String(passwordTF.getPassword());
LoginRecord lr = new LoginRecord(login.trim(), pass.trim());
int asd = con.checkRegisterData(lr);
if(asd == 0){
JOptionPane.showMessageDialog(null, "You've successfully created an account", "Notice", JOptionPane.INFORMATION_MESSAGE);
loginTF.setText("");
passwordTF.setText("");
}
else if(asd == 999){
JOptionPane.showMessageDialog(null, "Please enter a Login ID or Password", "Error", JOptionPane.ERROR_MESSAGE);
}
else if (asd == 1){
JOptionPane.showMessageDialog(null, "The Login ID already exists", "Error", JOptionPane.ERROR_MESSAGE);
};
}
else if (e.getSource() == loginB) {
String login = new String(passwordTF.getPassword());
String pass = loginTF.getText();
LoginRecord lr = new LoginRecord(login.trim(), pass.trim());
con = new Controller();
int asd = con.checkLoginData(lr);
if(login.trim().isEmpty() && pass.trim().isEmpty()){
JOptionPane.showMessageDialog(null, "Please enter your Login ID and Password", "Error", JOptionPane.ERROR_MESSAGE);
}
else if(loginTF.getText().trim().equals("")){
JOptionPane.showMessageDialog(null, "Please enter your Login ID", "Error", JOptionPane.ERROR_MESSAGE);
}
else if(pass.trim().equals("")){
JOptionPane.showMessageDialog(null, "Please enter your Password", "Error", JOptionPane.ERROR_MESSAGE);
}
else if(asd == 0){
main1.cardLayout.show(main1.cards, "personal");
}
else if(asd == 1){
JOptionPane.showMessageDialog(null, "Please key in the correct Password or Login ID", "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
}
控制器类
public Controller() {
ds = new DataStorage();
}
public int checkRegisterData(LoginRecord lr) {
// Checks to see if both text fields are empty or not
if(lr.getLoginName().isEmpty() || lr.getPass().isEmpty()){
result = 999;
}
// Array is empty
else if(DataStorage.login.isEmpty()){
ds.storeLoginData(lr);
result = 0;
}
// There's no duplicate in the array
else if(ds.checkLogin(lr) == false){
ds.storeLoginData(lr);
result = 0;
}
// There's a duplicate in the array
else if(ds.checkLogin(lr) == true){
result = 1;
}
return result;
}
public int checkLoginData(LoginRecord lr){
boolean login = ds.checkLogin(lr);
boolean pass = ds.checkPassword(lr);
if (login && pass == true && true) {
result1 = 0;
}
else {
result1 = 1;
}
return result1;
}
}
DataStorage.class
公共类DataStorage {
public static Vector<LoginRecord> login = new Vector<LoginRecord>();
public boolean checkLogin(LoginRecord lr) {
for(int i = 0; i<login.size(); i++){
if(login.get(i).getLoginName().equalsIgnoreCase(lr.getLoginName())){
return true; // Duplicate exists
}
}
return false;
}
public void storeLoginData(LoginRecord lr) {
login.add(lr);
}
public boolean checkPassword(LoginRecord lr){
for (int i = 0; i <login.size();i++){
if(login.get(i).getPass().equalsIgnoreCase(lr.getPass())){
return true; // Duplicate exists
}
}
return false;
}
}
在您的retrieveLoginData
方法中,您传递一个String
LoginData(用户名?)和一个密码(没有意义)。
您检查存储在中的Object Vector
(是LoginRecord
)和String(永远不会相等)之间的相等性。
同样,将密码作为参数也是没有意义的。
您要么要求存储在中的用户名相等,要么LoginRecord
必须LoginRecord
根据您的用户名和密码创建一个新的用户名,然后要求新对象与所存储的用户名之间相等。这是没有意义的,因为如果有人尝试使用相同的用户名和不同的密码创建用户,那么它也将不相等。
现在,您编辑了一些内容,并获得了LoginRecord
as参数。但是您仍然要求LoginRecord
(login.get(i).equals
)和字符串之间相等lr.getLoginname
你必须使 login.get(i).getLoginName.equals(lr.getLoginName)
因此,总的来说,下面是代码:
public boolean retrieveLoginData(LoginRecord lr) {
for(int i = 0; i<login.size(); i++){
if(login.get(i).getLoginName.equals(lr.getLoginName)){
return true;
}
}
return false;
}
第二个问题:
您的问题是您在密码检查时正在检查loginName,而您可能想在其中检查密码。
还有一个问题是,您正在检查密码和用户名无关。如果有人使用用户名ABC和密码DEF,又有人使用用户名123和密码456,则用户可以使用两种组合登录(ABC:456和123:DEF可以使用)
public boolean checkLogin(LoginRecord lr) {
for(int i = 0; i<login.size(); i++){
if(login.get(i).getLoginName().equalsIgnoreCase(lr.getLoginName())){
return true; // Duplicate exists
}
}
return false;
}
public boolean checkPassword(LoginRecord lr){
for (int i = 0; i <login.size();i++){
if(login.get(i).getPass().equalsIgnoreCase(lr.getLoginName())){
return true; // Duplicate exists
}
}
return false;
}
您真正想要做的是同时询问Usercredentials:
public boolean checkLogin(LoginRecord lr) {
for(int i = 0; i<login.size(); i++){
if(login.get(i).getLoginName().equalsIgnoreCase(lr.getLoginName()) &&
login.get(i).getPass().equalsIgnoreCase(lr.getPass())){
return true; // Duplicate exists
}
}
return false;
}
另外,如果您有时间阅读有关安全性的更多信息,那么使用和保存密码哈希将更加安全。但是,如果您只是在四处闲逛而又想学习一切,那应该没问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句