用户验证电子邮件和密码(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() {
}
}

正如您的示例所示,最简单的方法(字符串文字检查)是将尝试保持在会话中。通过这种方式,尝试与会话绑定(换句话说,与浏览器的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;DR

我看到,每个来到这里的人可能都需要一点关于请求和会议的简报。

你必须明白,每次你在浏览器中输入url时,dedoGetdoPost内部的代码都会被执行(你原来帖子中的int attempts = 3;每次都会被处决,所以它总是3)。

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

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

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

相关内容