【问题标题】:Preserving session in Java with sendredirect使用 sendredirect 在 Java 中保留会话
【发布时间】:2012-11-07 20:23:02
【问题描述】:

我正在用 JAVA 创建一个登录应用程序。我正在用 JSP 和 Servlet 中的所有逻辑(数据库连接)进行演示[这不是我知道的正确方法]。 我在 Servlet 中检查用户名密码,然后创建一个会话变量。 并像这样添加会话

sess.setAttribute("username",oName);

然后我将用户重定向到它的主页,比如 student.jsp

response.sendRedirect("student.jsp");

它删除了会话变量。我需要一种方法来保留会话变量并移至 student.jsp。我尝试使用转发,但没有成功。

RequestDispatcher dispatcher =
                getServletContext()
                    .getRequestDispatcher("/student.jsp");

            if (dispatcher != null) {
                dispatcher.forward(request, response);
            }

它转发请求但页面地址没有更改为student.jsp,这不好。 在这方面的任何帮助将不胜感激 谢谢

【问题讨论】:

  • 这里有一个很好的教程,可以帮助你进行转发。它相当于 Servlet javapractices.com/topic/TopicAction.do?Id=181 中的 JSP 转发
  • 这就是转发的工作原理:替换浏览器的内容,而不是 URL。您需要使用重定向,但不知何故,您进行测试的浏览器不允许使用 cookie。在浏览器中启用 cookie 并再次运行应用程序。

标签: java jsp jakarta-ee servlets jspinclude


【解决方案1】:

为了让重定向的请求返回并附加到同一个会话,它需要一个会话 ID,通常在 JSESSIONID(或其他名称)cookie 或 URL 中作为参数携带。

这个 cookie 或 URL 参数应该由 servlet 容器添加,您不必自己添加。

如果您在浏览器中看不到 cookie,并且您没有将 JSESSIONID 附加到 URL,那么它正在为每个请求创建一个新会话,而不是附加到同一个会话。

【讨论】:

    【解决方案2】:

    使用RequestDispatcher 并使用request.setAttribute() 设置您的用户名变量。在这种情况下,调度程序不会创建新请求,但会使用forward() 方法转发相同的请求。

    【讨论】:

    • 这根本无法解决 OP 的具体问题。这样用户就不会在任何后续请求中登录。
    【解决方案3】:

    尝试编辑您的 tomcat context.xml 文件并将 <Context> 标记替换为 <Context useHttpOnly="false"> ,这对我有帮助。

    【讨论】:

      【解决方案4】:

      例如 Chromium 等某些浏览器不允许来自本地主机或 IP 地址的 cookie,因此无法保留会话并在每次刷新时更改。这可以通过显示请求的所有 cookie 的浏览器开发工具轻松检查。

      对于开发,设置您的工作站以将一些更重要的名称(如 host.kitty.com)解析为 localhost。在 Linux 下,只需在 /etc/hosts 中添加条目即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-21
        • 2011-12-25
        • 2017-09-21
        • 1970-01-01
        • 2012-08-25
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多