使用会话和cookie进行Servlet身份验证

时间:2015-11-26 09:18:28

标签: java session servlets cookies

我需要实现简单的servlet用户身份验证(在Java动态Web项目中),但有些事情让我感到困惑。

首先,servlet由于某种原因创建了cookie JSESSIONID,尽管我从未要求它。而且,我无法改变它的价值,如果我做request.addCookie(new Cookie("JSESSIONID", session.getId())),它会产生这样的结果:

Cookie: JSESSIONID=6B5B441038414B4381EDB7470018F90E; JSESSIONID=7890D45DF445635C49BDEB3CADA8AD99; .......

所以,它复制了cookie。

其次,我不确定在哪里比较Cookie和会话的ID,以及在何处以及如何正确创建会话(即request.getSession(true? / false? / nothing?);

我已阅读了一些文档,但仍需要帮助。

我有servlet HomeServlet,如果用户未经过身份验证,则会将用户重定向到authentication页面。

这是我如何做到的(HomeServlet.java):

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        if(request.getSession().getAttribute("user") != null) {
            request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
        } else {
            response.sendRedirect("authentication");
        }
    }

我还有AuthServlet,它为jsp页面提供身份验证表单并验证用户。

AuthServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String action = request.getParameter("ACTION");

    if ("login".equals(action)) {
        String[] result = doSomeValidations();

        if (result.size() > 0) { // show validation errors
            request.setAttribute("errorLoginMessage", result);
            request.setAttribute("email", email);
            doGet(request, response);
        } else { // authenticate user
            request.getSession().setAttribute("user", userObject);
            request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
        }
    } else if ("signup".equals(action)) {
        // ...........................          
    } else {
        doGet(request, response);
    }
}

那么,你能帮我理解一下吗?如何实现用户身份验证并让用户在整个会话期间保持登录状态?

1 个答案:

答案 0 :(得分:5)

  

首先,servlet由于某种原因创建了cookie JSESSIONID   虽然我从不要求它

HttpSession jsession = request.getSession();  

您正在此处请求会话,而JSESSIONID Cookie由容器在响应中创建

  

如何正确创建会话request.getSession(true?/ false?/ nothing?);

如果需要,

request.getSession()request.getSession(true)与他们开始新会话完全相同,但request.getSession(false)表示如果已有会话使用它,但是如果没有&#t}} #39;开始一个。 您希望如何以及在何处开始会话完全取决于您的要求

 response.addCookie(new Cookie("JSESSIONID", jsession.getId()));

您不会自行添加JSESSIONID Cookie,容器会为您执行此操作。

此外,您应该在应用中创建一次会话,一旦JSESSIONID cookie存储在用户的浏览器中(提供了Cookie),它将与请求一起发送。

  

如何实施用户身份验证

非常主观且依赖于要求,您可以阅读此https://docs.oracle.com/cd/E19226-01/820-7627/bncby/index.html

  

让用户在整个会话期间保持登录状态

您的会话Cookie将在用户通过身份验证后为您提供帮助,例如登录Facebook并保持Cookie标签打开