14

我在面试中也遇到过这个问题。我确实对 Java 中的 Session Scope 和它的管理有很多困惑。

在 web.xml 我们确实有条目:

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

它实际上表明了什么?是整个项目的范围吗?

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

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

4

6 回答 6

26

会话管理不仅限于 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 也可以存储:

于 2010-06-18T05:39:31.833 回答
2

它实际上表明了什么?

会话的生命周期。如果客户端和服务器之间 30 分钟没有事务,则会话过期(每个代码段)

是整个项目的范围吗?

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

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

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

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

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

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

持久性 cookie

于 2010-06-18T05:33:53.623 回答
0

如果您在不同的窗口中打开相同的应用程序,我的意思是浏览器的多个实例,它将为每个实例创建不同的会话。

于 2010-06-18T15:50:36.047 回答
0

我们有 4 种方法来管理会话。

1.Cookies 2.URL重写 3.隐藏表单域 4.HTTP会话

第四个功能强大,现在主要使用。

于 2013-03-20T15:33:14.493 回答
0

Java 中的 Servlet 有一个 HttpSession 对象,您可以使用它来存储用户的状态信息。会话由 cookie (JSESSIONID) 在客户端管理,或者可以使用 URL 重写来完成。会话超时描述了在删除存储在 HttpSession 中的状态信息之前,服务器将在最后一个请求之后等待多长时间。

范围是每个浏览器实例,因此在示例中,您从两台不同的电脑登录将产生两个会话对象。

于 2010-06-18T05:31:22.317 回答
0

我推荐Apache Shiro进行会话管理、身份验证和授权。

我把它收回。

正如@BalusC 在下面评论的那样,只有 servlet 容器负责管理 http 会话。Shiro只是使用它。它将通过您明确定义的过滤器连接到 HttpSession。

于 2013-01-10T14:00:35.507 回答