【问题标题】:How is HttpSession Stored in the Servlet Framework [duplicate]HttpSession如何存储在Servlet框架中[重复]
【发布时间】:2015-05-04 14:38:27
【问题描述】:

这是一个很好的补救问题。我以前没有使用过HttpSession 类。我正在阅读this tutorial,我看到会话是HttpServletRequest 的属性。

public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    // get current session, or initialise one if none
    HttpSession sess = req.getSession(true);
}

我的问题是,会话如何存储?在客户端?过去我习惯于存储会话服务器/数据库端。这是如何运作的?如果我根据给定请求更新会话,这是否会始终反映在后续调用中?会话是否存储在客户端上?

【问题讨论】:

  • Session 不存储在客户端,而是一个session key 唯一标识服务器端的会话数据。 “关键”数据通常使用 cookie 或请求标头存储在客户端。
  • 那么在教程中他们如何从这个方法调用中获取数据呢? ` String username = req.getParameter("username");`
  • 在通过 HTTP/HTTPS 消息发送纯文本之前,您的服务器/容器将在 server side 上执行此语句。所以你的server 知道将特定请求与哪个会话相关联。它是服务器标准的一部分。
  • @DavidWilliams 这与会话无关,这是一个请求参数。
  • 如果是无状态会话,您需要将会话详细信息存储在数据库中。如果它是一个有状态的会话,您可以通过将会话存储在 HttpSession 中并将其存储在浏览器 cookie 中来处理,然后针对每个操作进行比较。

标签: java session servlets


【解决方案1】:

使用会话 cookie,或者如果 cookie 被禁用,您可以看到 JSESSIONID 参数。至少前一段时间是这样的,我不应该认为它已经改变了。

【讨论】:

  • 所以这是一个存储在客户端的会话对象,对吗?
  • @DavidWilliams 不,它是一个会话 ID,用于检索服务器上的会话。
  • 所以在本教程中,getSession 之后的下一个调用是 String username = req.getParameter("username"); 这些数据来自哪里?
  • @DavidWilliams 来自 URL,作为请求参数。
  • 这是来自 URL 的请求参数:http//server:port/myApp/myServlet?username=Peter
【解决方案2】:

会话如何存储?在客户端?过去我有 习惯于存储会话服务器/数据库端。如何 这行得通吗?

会话可以定义为服务器端的信息存储,希望在用户与网站或 Web 应用程序的交互过程中持续存在。

会话是否存储在客户端上?

不是通过 cookie 在用户浏览器中存储大量且不断变化的信息,而是在客户端仅存储一个唯一标识符(称为“会话 ID”)。每次浏览器发出 HTTP 请求(即页面链接或 AJAX 请求)时,都会将此会话 ID 传递给 Web 服务器。 Web 应用程序将此会话 ID 与其内部数据库配对,并检索存储的变量以供请求的页面使用。

当调用 getSession() 方法时,如果存在则返回会话,否则它会创建一个新会话。除了创建会话之外,它还会做 5 件你不会做的事情。

  1. 您不会自己创建新的 HttpSession 对象。

  2. 你没有 生成唯一的会话 ID。
  3. 您没有制作新的 Cookie 目的。

  4. 您没有将会话 ID 与 cookie 相关联。
  5. 你没有设置 将 Cookie 放入响应中
All the cookie work happens behind the scenes.

如果我根据给定请求更新会话,那会 总是通过后续调用反映出来?

是的,它会影响后续调用。

【讨论】:

  • 如果它没有存储在客户端,并且我有多个服务器,并且负载均衡器上没有会话粘性,那么对会话对象的修改如何通过多次调用反映?
  • @DavidWilliams :在这种情况下,您将在每个服务器一个会话中获得未定义的行为,而无需知道哪个服务器被击中。但是在没有特殊会话处理(粘性会话或共享会话)的情况下为同一个 URL 设置多个服务器肯定是服务器配置错误!
  • @DavidWilliams 如果在存储 jSessionId 的客户端上禁用了 cookie?
【解决方案3】:

HttpSession 默认存储在内存中,并由 Web 服务器(jetty、tomcat、...)创建/维护。根据您使用的 Web 服务器,您可能有一些选项,例如将会话信息存储到数据库中。

这是会话管理器的 tomcat 文档[1]

[1]https://tomcat.apache.org/tomcat-7.0-doc/config/manager.html

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2011-08-11
    • 2016-03-26
    • 2018-04-02
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多