首页 > 解决方案 > 用户验证电子邮件和密码(Java web、servlet)

问题描述

我创建了一个简单的登录网站,用户在其中输入电子邮件和密码并检查用户和密码是否正确,然后他被重定向到 Welcome.jsp 页面,上面显示登录成功,我正在检查 3 封电子邮件和密码并为每个会话创建会话,我面临的问题是,如果用户在 3 次尝试后输入电子邮件或密码错误,他将被阻止一段时间,时间到期后他可以再试一次,我可以'想不出办法,有没有办法做到这一点?

import java.io.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

//@WebServlet(name = "loginController", value = "/login")
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
IOException {
    String email = request.getParameter("email");
    String password = request.getParameter("password");
    String er = "Invalid user info";
    int attempts = 3;
    PrintWriter printWriter = response.getWriter();
    LoginBean loginBean = new LoginBean();

    loginBean.setEmail(email);
    loginBean.setPassword(password);

    try
    {
        if(email.equals("Mhamdoon4@gmail.com") && password.equals("pass001"))
        {
            System.out.println("Admin's Home");

            HttpSession session = request.getSession(); //Creating a session
            session.setAttribute("Mohammed", email); //setting session attribute
            request.setAttribute("email", email);

            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        }
        else{
            attempts--;
            printWriter.println(attempts + " left");

        }
        if(email.equals("Mhamdoon6@gmail.com") && password.equals("pass0011"))
        {
            System.out.println("Editor's Home");

            HttpSession session = request.getSession();
            session.setAttribute("Ali", email);
            request.setAttribute("email", email);

            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        }
        else{
            attempts--;
            printWriter.println(attempts + " left");
        }
        if(email.equals("Mhamdoon12@gmail.com") && password.equals("pass00901"))
        {
            System.out.println("User's Home");

            HttpSession session = request.getSession();
            session.setAttribute("Adam", email);
            request.setAttribute("email", email);

            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        }
        else{
            attempts--;
            printWriter.println(attempts + " left");
        }
//            if()
//            {
//                System.out.println("Error message = Invalid info");
//                request.setAttribute("errMessage", er);
//
//                request.getRequestDispatcher("fail.jsp").forward(request, response);
//            }
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
    }
    catch (Exception e2)
    {
        e2.printStackTrace();
    }
    }
public void destroy() {
}
}

标签: javaservletsjava-ee-8

解决方案


由于您的示例很简单(字符串文字检查),最简单的方法是将尝试保留在会话中。这样,尝试与会话相关联(换句话说,与浏览器的 cookie 相关联)。

要在会话中设置值:

request.getSession().setAttribute("loginAttempts", 3);
request.getSession().setAttribute("lastLoginAttempt", LocalDateTime.now());

要阅读它们:

Integer attempts = (Integer) request.getSession().getAttribute("loginAttempts");
LocalDateTime lastLoginAttempt = (LocalDateTime) request.getSession().getAttribute("lastLoginAttempt");

现在,您只需在成功登录后使用这些值、重新计算和重置它们。只要浏览器会话保持不变,变量就会保持不变。

TL;博士;

我看到最后来到这里的每个人都可能需要一些关于请求和会话的简报。

您必须了解每次在浏览器中输入 url 时进入dedoGet或执行的代码段(每次都执行原始帖子中的代码,因此它始终为 3)。doPostint attempts = 3;

HttpServletRequest服务器每次都会收集来自客户端浏览器请求的所有数据,并构建一个包含所有数据(url、请求参数、cookie、ip、端口等)的全新对象。按 f5?一切都会以全新的HttpServletRequest.

服务器用来在服务器和客户端(浏览器)之间保持会话状态的方式是通过会话。Session 是请求之间唯一保留的东西。您可以将变量保存在 Session 中以供以后使用(例如attemptslastLoginAttempt),并依靠 Session 来查看用户是否成功登录。

如果在每个请求中重新创建所有内容,服务器如何保持请求之间的会话?通过会话 cookie。服务器使用一个普通的 cookie,它给它一个特殊的值(在 Servlet 规范中,这个 cookie 是JSESSIONID)。当一个请求没有那个cookie时,服务器会创建一个给它一个唯一标识符的值。来自同一浏览器的下一个请求将具有该 cookie,并且服务器将使用该 cookie 将会话附加到HttpServletRequest从该浏览器的请求生成的每个请求中。因此,在每个请求中创建的全新HttpServletRequest版本中,服务器会向其中注入HttpSession相同的JSESSIONID.


推荐阅读