什么是 Java 中的会话管理?

我在面试中也遇到过这个问题。我确实对Java中的会话范围和it管理有很多困惑。

在网络.xml我们确实有条目:

<session-config>
        <session-timeout>
            30
        </session-timeout>
</session-config>

它实际上意味着什么?是整个项目的范围吗?

让我感到困惑的另一点是,我们如何在同一项目中分离多个请求的会话范围?意味着如果我从PC登录,同时我从另一台PC登录,它会区分它吗?

另外,另一个令人困惑的事情是浏览器的差异。为什么不同的Gmail可以在不同的浏览器中打开?Gmail可以阻止从登录到注销的会话。如何通过我们的个人网站进行维护?


答案 1

会话管理不仅限于 Java 和 servlet。以下是它大致是如何发生的:

  1. HTTP协议是无状态的,因此服务器和浏览器应该有一种通过多个请求存储用户身份的方法。
  2. 浏览器将第一个请求发送到服务器
  3. 服务器检查浏览器是否已使用会话 Cookie 进行标识(见下文)

    3.1. 如果服务器不“知道”客户端:

    • 服务器创建一个新的唯一标识符,并将其作为键(粗略地)放在 Map 中,其值为新创建的 Session。它还会发送包含唯一标识符的 cookie 响应。

    • 浏览器存储包含唯一标识符的会话cookie(生存期=浏览器实例的生存期),并将其用于每个后续请求以唯一标识自己。

    3.2. 如果服务器已经知道客户端 - 服务器获取与会话cookie中传递的唯一标识符相对应的会话

现在进入一些问题, 你有:

  • 会话超时是每个会话映射条目的生存时间,无需访问。换句话说,如果客户端在 30 分钟内未发送请求(从您的示例中),会话映射将删除此条目,即使客户端使用会话 Cookie 中的唯一密钥标识自己,服务器上也不会存在任何数据。

  • 不同的 gmail(以及任何网站)都可以在不同的浏览器中打开,因为会话 Cookie 是按浏览器设置的。即,每个浏览器通过不发送唯一的会话ID或通过发送服务器为其生成的会话ID来唯一地标识自己。

  • 来自不同PC的日志记录实际上是相同的 - 您不共享会话ID

  • 注销实际上是删除服务器上会话 ID 的条目。

注意:唯一的会话ID也可以存储:


答案 2

它实际上意味着什么?

会话的生存期。如果客户端和服务器之间在 30 分钟内没有事务(根据代码段),会话将过期

是整个项目的范围吗?

它具有应用范围。为每个 Web 应用程序定义

让我感到困惑的另一点是,我们如何在同一项目中分离多个请求的会话范围?意味着如果我从PC登录,同时我从另一台PC登录,它会区分它吗?

是的。会话ID(Apache Tomcat的JSESSIONID)将有所不同。

另外,另一个令人困惑的事情是浏览器的差异。为什么不同的Gmail可以在不同的浏览器中打开?

同一用户从不同的浏览器登录的每次登录都是完全不同的会话。在一个浏览器中设置的 cookie 不会影响另一个浏览器。因此,不同的Gmail实例可以在不同的浏览器中使用。

Gmail可以阻止从登录到注销的会话。如何通过我们的个人网站进行维护?

持久性饼干


推荐