使用会话和cookie登录servlet应用程序

问题描述 投票:0回答:1

我需要用java编写一个登录servlet,也使用cookie。这些是要求:

-页面必须提供注册和登录(用户选择要做什么)。如果他们选择注册,输入信息后(只需姓名、用户名和密码,登录和注册相同),他们将被重定向到登录页面。 - 在登录的情况下,应用程序需要计算登录尝试次数(最多 2 次错误尝试),然后向用户显示一条消息,让他们知道 10 秒后不再有尝试。这必须通过 cookie 来完成。 -应用程序必须检查正在登录的用户是否已经在数据库中(一个假的,只是一个ArrayList)。 - 登录成功后,将显示“欢迎”消息。 -用户也必须能够注销。

这是我到目前为止所拥有的:

@WebServlet("/loginservlet")
public class LoginServlet extends HttpServlet {

    private static final int ATTEMPTS_MAX = 2;
    private static final Logger logger = Logger.getLogger(LoginServlet.class.getName());
    ArrayList<User> list = new ArrayList<>();
 
    
    public LoginServlet() {
        User u1 = new User("Alba", "alba01", "pass");
        User u2 = new User("Maira", "maira01", "pass");
        User u3 = new User("Carol", "carol01", "pass");
        User u4 = new User("Debora", "debo01", "pass");
        list.add(u1);
        list.add(u2);
        list.add(u3);
        list.add(u4);
    }
 
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
       
        String task = request.getParameter("task");
        if (task == null) {
            response.sendRedirect("index.html");
            return;
        }
        switch (task) {
            case "formlog":
                showFormLog(request,response);
                break;
            case "formreg":
                showFormReg(request,response);
                break;
            case "register":
                processReg(request,response);
                break;
            case "login":
                processLog(request,response);
                break;
            case "default":
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid task");
                break;
        }
    }
 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    
    @Override
    public String getServletInfo() {
        return "Short description";
    }

    private void showFormLog(HttpServletRequest request, HttpServletResponse response) {
        try {
            RequestDispatcher dispatcher=null;
            dispatcher=request.getRequestDispatcher("/formlog.jsp");
            dispatcher.forward(request, response);
        } catch (ServletException | IOException ex) {
            logger.log(Level.SEVERE, "Error showing the log form", ex);
        }
    }
    private void showFormReg(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            RequestDispatcher dispatcher = null;
            dispatcher=request.getRequestDispatcher("/formreg.jsp");
            dispatcher.forward(request, response);
        } catch (ServletException ex) {
            logger.log(Level.SEVERE, "Error showing the reg form", ex);
    }
}
 
    private void processReg(HttpServletRequest request, HttpServletResponse response) throws IOException {
                String nameReg=request.getParameter("name");
                String usernameReg=request.getParameter("username");
                String passReg=request.getParameter("password");
                
                if(nameReg !=null && usernameReg !=null && passReg !=null){
                    list.add(new User(nameReg, usernameReg, passReg));
                    response.sendRedirect("loginservlet?task=formlog");
                }else{
                    response.sendRedirect("loginservlet?task=formreg");
                }
    }
 
    private void processLog(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
                String nameLog=request.getParameter("name");
                String usernameLog=request.getParameter("username");
                String passLog=request.getParameter("password");
                
                logger.info("Login attempt: name=" + nameLog + ", username=" + usernameLog);                
                
                if (nameLog == null || usernameLog == null || passLog == null) {
                request.setAttribute("error", "All info required");
                request.getRequestDispatcher("/formlog.jsp").forward(request, response);
                   return;
    }
                
                Cookie[] cookies = request.getCookies();
                int failedAttempts= 0;
                Cookie cookieAttempts = null;

                if (cookies != null) {
                    for (Cookie cookie : cookies) {
                        if (cookie.getName().equals("failedAttempts")) {
                            failedAttempts= Integer.parseInt(cookie.getValue());
                            cookieAttempts = cookie;
                            break;
                        }
                    }
                }
                
                if (failedAttempts>= ATTEMPTS_MAX) {
                request.setAttribute("error", "Too many attempts. wait 10 seconds.");
                RequestDispatcher dispatcher = request.getRequestDispatcher("/formlog.jsp");
                dispatcher.forward(request, response);
                return;
                }
                
                boolean correctLogin= false;
                for (User user : list) {
                    if (user.getName().equals(nameLog) && user.getUsername().equals(usernameLog) && user.getPass().equals(passLog)) {
                    correctLogin= true;
                    break;
                    }
                }
                
                
                if (correctLogin) {
                    HttpSession session = request.getSession();
                session.setAttribute("username", usernameLog);
                    
                    if (cookieAttempts != null) {
                    cookieAttempts.setValue("0");
                    cookieAttempts.setMaxAge(0);
                    response.addCookie(cookieAttempts);
                    }
                response.sendRedirect("welcome.jsp");
                } else {failedAttempts++;
                
                
                if (cookieAttempts== null) {
                        cookieAttempts= new Cookie("failedAttempts", String.valueOf(failedAttempts));
                } else {
                    cookieAttempts.setValue(String.valueOf(failedAttempts));
                }
                cookieAttempts.setMaxAge(10);
                response.addCookie(cookieAttempts);
        
                request.setAttribute("error", "Incorrect user or pass. Intento " + failedAttempts+ " de " + ATTEMPTS_MAX);
                RequestDispatcher dispatcher = request.getRequestDispatcher("/formlog.jsp");
                dispatcher.forward(request, response);
    }
}
                               
}

当我在浏览器中执行时,我可以看到表单,但它根本不起作用。

java authentication session cookies servlets
1个回答
0
投票

您必须在应用程序服务器上执行此代码才能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.