java - 使用 session 和 cookie 的 Servlet 身份验证

标签 java session servlets cookies

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

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

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

所以,它复制了 cookie。

其次,我不确定在哪里比较 cookie 和 session 的 id,以及在哪里以及如何正确创建 session (即 request.getSession(true?/false?/Nothing?);)

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

<小时/>

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

这是我的做法(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);
    }
}
<小时/>

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

最佳答案

Firstly, the servlet for some reason creates the cookie JSESSIONID although I never ask it to

HttpSession jsession = request.getSession();  

您在此处请求 session ,JSESSIONID cookie 由容器在响应中创建

how to create session correctly request.getSession(true? / false? / nothing?);

request.getSession()request.getSession(true) 完全相同,它们在需要时启动新 session ,但是 request.getSession(false) ) 表示如果已经存在 session ,则使用它,但如果没有,则不要启动 session 。 您希望如何以及在何处开始 session 完全取决于您的要求

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

您不能自己添加 JSESSIONID cookie,容器会为您完成此操作。

此外,您还应该在应用程序中创建一次 session ,一旦 JSESSIONID cookie 存储在用户的浏览器中(前提是启用了 cookie),它将与请求一起发送。

How do I implement user authentication

高度主观且取决于要求,您可以阅读此https://docs.oracle.com/cd/E19226-01/820-7627/bncby/index.html

keep the user logged in throughout the session

一旦用户通过身份验证,您的 session cookie 将帮助您完成此操作,例如登录 Facebook 并保持 cookie 选项卡打开

关于java - 使用 session 和 cookie 的 Servlet 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33934633/

相关文章:

java - 将日期作为参数从 JSP 发送到 servlet

java - 如何使用 OpenCV 和 Java 从(视频)图像中删除背景?

java - Tomcat 仍然不显示目录列表,即使我在 conf/web.xml 中启用它

java - 在 Activity 之外使用 AsyncTask 时遇到问题

session - CQRS 和 session

java - Hibernate PersistenceContext session 刷新

ruby-on-rails - 从 Rails 的任何地方访问 "session key"cookie 名称

java - 访问经过身份验证的 servlet

java - 如何知道 IntentService 何时完成?

java - JDO Google App Engine 验证用户