簡體   English   中英

用戶驗證電子郵件和密碼(Java web、servlets)

[英]user verification email and password (Java web,servlets)

我創建了一個簡單的登錄網站,用戶在其中輸入電子郵件和密碼並檢查用戶和密碼是否正確,然后他被重定向到一個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; 博士;

我看到最后來到這里的每個人都可能需要一些關於請求和會議的簡報。

您必須了解每次在瀏覽器中輸入 url 時都會執行 de doGetdoPost內部的代碼段( int attempts = 3;每次都執行來自您的原始帖子,因此它始終為 3) .

服務器收集來自客戶端瀏覽器請求的所有數據,並構建一個全新的HttpServletRequest對象,該對象包含每次的所有數據(url、請求參數、cookie、ip、端口等)。 按f5? 一切都使用全新的HttpServletRequest再次執行。

服務器用來在服務器和客戶端(瀏覽器)之間保持對話狀態的方式是通過會話。 會話是請求之間唯一保留的內容。 您可以在 Session 中保存變量以備后用(例如attemptslastLoginAttempt ),並依靠 Session 來查看用戶是否成功登錄。

如果在每個請求中都重新創建了所有內容,服務器如何保持請求之間的會話? 通過會話cookie。 服務器使用一個普通的 cookie,它賦予一個特殊的值(在 Servlet 規范中,這個 cookie 是JSESSIONID )。 當一個請求沒有那個 cookie 時,服務器會創建一個給它一個唯一標識符的值。 來自同一瀏覽器的下一個請求將具有該 cookie,並且服務器將使用該 cookie 將會話附加到從該瀏覽器的請求生成的每個HttpServletRequest 因此,在每個請求中創建的全新HttpServletRequest中,服務器將同一JSESSIONID使用的相同HttpSession注入其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM