tcp 断开连接时的 Http session 持久性

标签 http session tomcat web-applications session-cookies

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

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

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

最佳答案

Since the HTTP 1.1 uses persistent connections, I assume that a session is invalidated when a TCP connection disconnects. Or not?

这是错误的。

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

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

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

Since the HTTP 1.1 uses persistent connections,

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

Additionally if it is not, how could we programmatically invalidate it on the server when a tcp connection resets?Is there such e.g. listener in Tomcat?

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

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

I am confused on this since otherwise the behavior using cookies vs URL-rewriting would not be the same,right?I mean the browser does not store the values part of the URL-rewriting to disk, correct?

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

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

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

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

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

关于tcp 断开连接时的 Http session 持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902533/

相关文章:

php - Angular 6 HttpClient 和 PHP 错误 (unknown url) : 0 Unknown Error 的 Http 失败响应

java - JAAS登录模块中的用户主体-额外的属性是单独的主体还是Bean属性?

http - 为什么浏览器请求不通过我的代理服务器?

java - 将域分配给 IP 地址

c# - 从 Web API 在 MVC 中存储 Bearer Token 的位置

php - session /身份验证如何与 nginx/NHPM/PHP-FPM 一起工作?

php - 成功登录后重新生成 session ID 是否足以防止 session 固定?

java - ClassNotFoundException : com. allen_sauer.gwt.log.client.WrappedClientThrowable

java - 如何停止从 Eclipse Gradle 插件启动的 Tomcat 服务器?

纯文本/文本的 Angular 8/httpclient 错误响应,无法解析响应