Java 中的会话管理是啥?

Posted

技术标签:

【中文标题】Java 中的会话管理是啥?【英文标题】:What is session management in Java?Java 中的会话管理是什么? 【发布时间】:2011-03-05 06:54:21 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

会话管理不仅限于 Java 和 servlet。大致是这样的:

    HTTP协议是无状态的,所以服务器和浏览器应该有办法通过多次请求存储用户的身份 浏览器向服务器发送第一个请求

    服务器检查浏览器是否已识别会话 cookie(见下文)

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

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

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

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

现在谈谈你的一些问题:

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

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

从不同的 PC 记录实际上是相同的 - 你不共享会话 ID

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

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

在 cookie 中 在网址中 (http://example.com/page;JSESSIONID=435342342) 2 或 3 种我不记得且不感兴趣的其他方式

【讨论】:

【参考方案2】:

它实际上表示什么?

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

是整个项目的范围吗?

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

让我感到困惑的另一点是 我们将会话范围分开 同一个项目中的多个请求? 表示如果我从 PC 登录 & 同时我正在从 另一台电脑,它有区别吗?

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

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

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

Gmail 可以阻止会话 登入登出。它是如何维护的 使用我们的个人网站?

Persistent cookies

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

我收回它。

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

【讨论】:

Shiro 与 HTTP 会话管理无关。它与身份验证和授权有关,如果 Web 应用程序“在幕后”确实会利用 HTTP 会话等。但它确实绝对不承担“会话管理”的责任。 servletcontainer 对此负责。 Shiro 只是在利用它。【参考方案6】:

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

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

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

【讨论】:

以上是关于Java 中的会话管理是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的会话是啥? [复制]

java web 做购物车的大概思路,和实现步奏是啥?

Java Web之会话管理一: 使用Cookie进行会话管理

[原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

Java会话技术之Cookie

Java会话技术之Cookie