java - 什么是 Java 中的 session 管理?

标签 java jsp session servlets session-management

我在面试中也遇到过这个问题。我确实对 Java 中的 session 范围及其管理感到困惑。

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

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

它究竟说明了什么?它是整个项目的范围吗?

另外一个让我很困惑的地方是如何在同一个项目中分离多个请求的session作用域?意思是说,如果我从一台 PC 登录,同时又从另一台 PC 登录,它能区分吗?

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

最佳答案

session 管理不仅限于 Java 和 servlet。大致情况如下:

  1. HTTP协议(protocol)是无状态的,所以服务器和浏览器应该有办法通过多次请求来存储用户的身份
  2. 浏览器向服务器发送第一个请求
  3. 服务器检查浏览器是否已识别 session cookie(见下文)

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

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

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

    3.2。如果服务器已经知道客户端 - 服务器获取与在 session cookie 中找到的传递的唯一标识符对应的 session

现在回答您的一些问题:

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

  • 不同的 gmail(以及任何网站)可以在不同的浏览器中打开,因为 session cookie 是针对每个浏览器的。 IE。每个浏览器通过不发送唯一 session ID 或发送服务器为其生成的 session ID 来唯一标识自己。

  • 从不同的 PC 登录实际上是相同的 - 您不共享 session ID

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

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

关于java - 什么是 Java 中的 session 管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067383/

相关文章:

session - 比戈到期日期的Golang session

java - 测试突然结束

java - 使用 JNDI 启用 Active Directory 帐户

spring - 将 csrf token 和 parameterName 添加到注销链接

javascript - 如何将 EL 表达式嵌入到由 jquery/javascript 生成并插入 JSP 页面的 HTML 字符串中?

session - Tomcat session 复制

java - 在 Spring Web 服务器中创建线程以运行超时任务

java - 如何从 Thymeleaf 调用对象的方法?

java - 使用 Java、Struts 2 和 AJAX 下载文件

asp.net - 使用 ASP.NET session 时是否可以强制请求并发?