Проверка пользователя с помощью HashMap на сервлете - PullRequest
0 голосов
/ 14 октября 2018

Мне нужно создать небольшое приложение, в котором пользователь вводит свое имя пользователя и пароль в html-форме, а затем обрабатывает их в сервлете, который имеет HashMap пользователей и пароли.HashMap должен быть инициализирован с некоторыми именами пользователей и паролями в методе init сервлета.Я должен проверить ввод пользователя с записями HashMap, и это где я застрял.Я не знаю, как сравнить записи HashMap с именем пользователя и паролем, введенными пользователем.Код, который у меня есть, приведен ниже:

    public class User {

    String username;
    String password;


    public User (String user, String pass){
        this.username = user;
        this.password = pass;

    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/AthorizationServlet")
public class AthorizationServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    public AthorizationServlet() {
        super();

    }


    public void init(ServletConfig config) throws ServletException {

        super.init(config);

        HashMap<Integer, User> uc = new HashMap <Integer, User>(); {
            uc.put(1, new User("user1", "pass1"));
            uc.put(2, new User ("user2", "pass2"));
            uc.put(3, new User ("user3", "pass3"));
            uc.put(4, new User ("user4", "pass4"));
        }
        Iterator<Entry<Integer, User>> it = uc.entrySet().iterator();
        while (it.hasNext()){
            //some code to validate user input against HashMap entries
        }
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("username");
        String pass = request.getParameter("password"); 


    }

}

1 Ответ

0 голосов
/ 14 октября 2018

Я хотел бы сказать, что причина, по которой вы застряли, состоит в том, что для HashMap, который отображает строки имени пользователя в пароли, потребуется HashMap<String, String> uc, но вы создали HashMap<Integer, User> uc, и это исключает значениеиспользуя HashMap!Если вы планируете использовать «оптимизацию», которую обеспечивает java.util.HashMap - это означает, что строки «хэшируются» для быстрого и простого поиска в структуре данных, вы должны сохранить HashMap следующим образом:

HashMap<Integer, User> uc = new HashMap <Integer, User>(); {
    uc.put("user1", "pass1");
    uc.put("user2", "pass2");
    uc.put("user3", "pass3");
    uc.put("user4", "pass4");
}

Таким образом, вы можете искать комбинации имени пользователя и пароля следующим образом:

public boolean checkPassword(String enteredUserName, String enteredPassword)
{
    String userPassword = uc.get(enteredUserName);
    return enteredPassword.equals(userPassword);
}

Если вам абсолютно необходимо использовать структуру данных «Пользователь» в вашей HashMap, другой альтернативой будет:

    HashMap<Integer, User> uc = new HashMap <Integer, User>(); {
        uc.put("user1", new User("user1", "pass1"));
        uc.put("user2", new User ("user2", "pass2"));
        uc.put("user3", new User ("user3", "pass3"));
        uc.put("user4", new User ("user4", "pass4"));
    }

, в этот момент получение пароля может выглядеть следующим образом:

public boolean checkPassword(String enteredUserName, String enteredPassword)
{
    String userPassword = uc.get(enteredUserName).getPassword();
    return enteredPassword.equals(userPassword);
}

Я не уверен, что такое "Integer" (идентификатор пользователя?), Который вы использовали для инициацииHashMap<Integer, User> - HOWEVER - самое важное, что нужно понять, это то, что целью HashMap является то, что «поиск» в таблице намного быстрее, потому что функция «Hash»выполняется на значение поиска.

Если вы не планируете искать вещи с помощью «Целочисленного идентификатора пользователя», то сохранение его в качестве ключа для HashMap вообще не имеет большого значения.

Ваш итератор должен будет перебрать всю таблицу, чтобы найти пользователя:

public boolean checkPassword(String enteredUserName, String enteredPassord)
{
        Iterator<Entry<Integer, User>> it = uc.entrySet().iterator();
        while (it.hasNext()){
            //some code to validate user input against HashMap entries
            User u = it.next().getValue();
            if (u.getUserName().equals(enteredUserName())
                return u.getPassword().equals(enteredPassword);
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...