【问题标题】:Servlet authentication using sessions and cookies使用会话和 cookie 的 Servlet 身份验证
【发布时间】:2016-02-29 07:30:36
【问题描述】:

我需要实现简单的 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);
    }
}

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

【问题讨论】:

  • 如果可以的话,我会考虑使用 Spring Security。推出自己的安全解决方案通常是个坏主意。 JSESSIONID 由您的 servlet 容器自动设置。
  • @MikePalfrey 我没有将任何框架用于教育目的,这就是我不能使用 Spring Security 的原因
  • @MikePalfrey 那么,你知道我的代码可能有什么问题吗?
  • 您根本不应该手动处理现有的 cookie。这是 servlet 容器本身的责任。只需设置/获取会话属性。阅读食物:stackoverflow.com/q/1700390
  • @BalusC 你能说得更具体点吗?我应该怎么做才能使我的用户能够进行身份验证?如果我只是获取/设置会话属性,如果我正确理解您的答案,任何用户都可以使用任何有效/无效 cookie 进行身份验证

标签: java session servlets cookies


【解决方案1】:

首先,servlet 出于某种原因创建了 cookie JSESSIONID 虽然我从来没有要求它这样做

HttpSession jsession = request.getSession();  

你在这里请求一个会话,JSESSIONID cookie 由容器创建作为响应

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

request.getSession()request.getSession(true) 完全相同,如果需要,它们会启动一个新会话,但request.getSession(false) 表示如果已经有一个会话,则使用它,但如果没有,则不要启动一个。 开始会话的方式和位置完全取决于您的要求

 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 标签页打开

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2019-12-25
    相关资源
    最近更新 更多