我在面试中也遇到过这个问题。我确实对 Java 中的 session 范围及其管理感到困惑。
在 web.xml 中我们确实有条目:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
它究竟说明了什么?它是整个项目的范围吗?
另外一个让我很困惑的地方是如何在同一个项目中分离多个请求的session作用域?意思是说,如果我从一台 PC 登录,同时又从另一台 PC 登录,它能区分吗?
此外,另一个令人困惑的事情是浏览器的差异。为什么不同的Gmail可以在不同的浏览器打开? Gmail 可以防止从登录到注销的 session 。我们的个人网站如何维护它?
最佳答案
session 管理不仅限于 Java 和 servlet。大致情况如下:
- HTTP协议(protocol)是无状态的,所以服务器和浏览器应该有办法通过多次请求来存储用户的身份
- 浏览器向服务器发送第一个请求
服务器检查浏览器是否已识别 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 也可以存储:
- 在 cookie 中
- 在网址中 ( http://example.com/page;JSESSIONID=435342342 )
- 另外 2 种或 3 种我不记得也不感兴趣的方式
关于java - 什么是 Java 中的 session 管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067383/