【问题标题】:User validation with HashMap on Servlet在 Servlet 上使用 HashMap 进行用户验证
【发布时间】:2023-03-26 03:52:01
【问题描述】:

我必须创建一个小应用程序,用户在其中以 html 表单输入他/她的用户名和密码,然后在具有用户和密码哈希映射的 servlet 中对其进行处理。 HashMap 应该在 servlet 的 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"); 


    }

}

【问题讨论】:

    标签: java html servlets hashmap user-input


    【解决方案1】:

    我想说你被卡住的原因是一个将用户名字符串映射到密码的 HashMap 需要一个HashMap&lt;String, String&gt; uc,但你已经创建了一个HashMap&lt;Integer, User&gt; uc,这样就消除了使用HashMap!如果您打算利用 java.util.HashMap 提供的“优化”——这意味着 String 被“散列”以便在数据结构中快速轻松地查找,您可以按如下方式保存 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);
    }
    

    我不确定您用来启动 HashMap&lt;Integer, User&gt; 的“整数”(用户 ID?)是什么 - 但是 - 最重要的是意识到 HashMap 的目的是在表中“查找”要快得多,因为对查找值执行“哈希”函数。

    如果您不打算使用“用户 ID 整数”进行查找,那么 将其存储为 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);
            }
    
    }
    

    【讨论】:

    • 非常感谢您的回复。首先,我想使用用户 ID 来比较密码和用户名,这就是为什么我在 HashMap 中添加了一个整数,但您的回复让我明白了如何更好地实现它。
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2016-05-11
    • 2012-02-11
    • 2012-01-29
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多