1

关于HTTP会话:它要么通过 cookie 实现,要么通过 URL 重写实现。

由于HTTP 1.1使用持久连接,我假设当 TCP 连接断开时会话无效。或不?
我对此感到困惑,因为否则使用 cookie 与 URL 重写的行为将不一样,对吗?我的意思是浏览器不会将 URL 重写的值部分存储到磁盘,对吗?

此外,如果不是,当 tcp 连接重置时,我们如何以编程方式在服务器上使其无效?Tomcat 中是否有这样的监听器?

4

1 回答 1

4

由于 HTTP 1.1 使用持久连接,我假设当 TCP 连接断开时会话无效。或不?

这是错误的。

在 Java 中,会话是通过 cookie 实现的,通常(tomcat、jetty 等)。在第一次响应时从服务器设置一个名为 JSESSIONID=1234567(随机生成并标识会话)的 cookie,然后将其存储在浏览器中,并在每次后续连接时发送回服务器。此 cookie 通常具有 30 分钟的默认生存期,并且在 tcp 连接中断时仍然存在。这允许服务器跨不同连接识别用户。

URL 重写意味着每个 URL 都包含 JSESSIONID 作为 URL 的一部分,在服务器端没有任何变化,除了 JSESSIONID 值是从 URL 而不是从 cookie 中读取的。

如果 tcp 连接关闭后 cookie 丢失了,那就完全没用了。想象一个基于持久 tcp 连接的聊天系统:如果您可以简单地从绑定到套接字的标识符中识别连接,您是否需要 cookie?不... cookie 之所以有用,正是因为您需要跨多个连接跟踪用户。

由于 HTTP 1.1 使用持久连接,

它们是持久的,这意味着在第一次请求(html 页面)之后,可以重复使用相同的连接来发送其他资源(图像、css、javascript 等)。并且浏览器会在一段时间后保持连接打开,以避免在用户单击另一个链接时重新创建新连接。这只是一种优化,并不意味着当您在浏览器中打开一个 URL 时,连接会在您停留在同一个网站上的所有时间内保持活动状态。

此外,如果不是,当 tcp 连接重置时,我们如何以编程方式在服务器上使其无效?Tomcat 中是否有这样的监听器?

在服务器上,您始终可以使会话调用无效session.invalidate()。如果您希望每次发出请求时都使会话无效,那么您根本不需要会话。

Cookie 也可以在客户端通过 javascript 失效。

我对此感到困惑,因为否则使用 cookie 与 URL 重写的行为将不一样,对吗?我的意思是浏览器不会将 URL 重写的值部分存储到磁盘,对吗?

URL 重写适用于禁用 cookie 的情况。基本上,每次点击链接时,都会在 url 中附加 JSESSIONID=,这样服务器就会识别用户,后续的所有链接都会在具有相同 JSESSIONID 的服务器上继续生成。这样,每个 POST 或 GET 请求都将包含用户(会话)的标识。

cookie 以相同的方式工作,只是它不是在 URL 上硬编码,而是作为标头信息嵌入到 HTTP 请求中,这是由浏览器自动完成的(除非它已被禁用)。

这并不意味着它会保存在磁盘中(出于什么目的?),它只是将其保存在内存中,用于会话 cookie(当您关闭浏览器或 30 分钟后过期)。

您可以为 cookie 设置更长的生命周期;在这种情况下,浏览器将 cookie 存储更长时间。但通常那些不是“会话cookie”,而是用于识别特定用户的cookie(如UUID)。当同一用户重新连接时,您可以从 UUID cookie 创建一个新的会话 cookie。

会话用于跟踪CONVERSATION。用户关闭浏览器,对话结束。如果存在像 UUID 这样的持久 cookie,那么您可以使用该 cookie 创建新会话并将新会话绑定到您之前遇到的同一用户。

于 2013-02-15T20:23:00.613 回答