关于HTTP
会话:它通过cookie或URL重写实现。
由于HTTP 1.1
使用持久连接,我认为当TCP连接断开连接时会话无效。或者不是?
我对此感到困惑,因为否则使用cookie与URL重写的行为会不一样,对吧?我的意思是浏览器不会将URL重写的部分存储到磁盘上,对吗?
另外,如果不是,当tcp连接重置时,我们如何在服务器上以编程方式使其无效?是否存在这样的情况? Tomcat中的监听器?
答案 0 :(得分:4)
由于HTTP 1.1使用持久连接,因此我认为当TCP连接断开连接时会话无效。或者不是?
这是错误的。
在Java中,会话通过cookie实现,通常是(tomcat,jetty等)。在第一个响应中从服务器设置一个名为JSESSIONID = 1234567的cookie(该数字随机生成并标识会话),然后将其存储在浏览器中,并在每次后续连接时发送回服务器。 此cookie通常具有30分钟的默认生存期,并且在tcp连接中断时仍然存在。这允许服务器通过不同的连接识别用户。
URL重写意味着每个URL都包含JSESSIONID作为URL的一部分,在服务器端没有任何变化,除了从URL而不是从cookie读取JSESSIONID值。
如果在tcp连接关闭后cookie丢失,则完全没用。想象一下基于持久性tcp连接的聊天系统:如果你能简单地从绑定到套接字的标识符中识别连接,你是否需要一个cookie?否...... Cookie非常有用,因为您需要跨多个连接跟踪用户。
由于HTTP 1.1使用持久连接,
它们是持久的,意思是在第一个请求(html页面)之后,可以重用相同的连接来发送其他资源(图像,css,javascript等)。并且浏览器会在之后的某个时间保持连接打开,以避免在用户单击另一个链接时重新创建新连接。这只是一种优化,并不意味着当您在浏览器中打开URL时,连接在您放在同一网站上的所有时间都保持活动状态。
另外,如果不是,当tcp连接重置时,我们如何在服务器上以编程方式使其无效?是否存在这样的情况? Tomcat中的监听器?
在服务器上,您始终可以使调用session.invalidate()
的会话无效。
如果您希望每次发出请求时使会话无效,那么您根本不需要会话。
Cookie也可以通过javascript在客户端无效。
我对此感到困惑,因为否则使用cookie与URL重写的行为会不一样,对吧?我的意思是浏览器不会将URL重写的部分存储到磁盘上,对吗?
URL重写适用于禁用cookie的地方。基本上,每次单击链接时,JSESSIONID =都会附加到url,因此服务器将识别用户,并且将继续在具有相同JSESSIONID的服务器上生成所有后续链接。这样,每个POST或GET请求都将包含用户标识(会话)。
cookie以相同的方式工作,只是它不是在URL上进行硬编码,而是作为头信息嵌入到HTTP请求中,这是由浏览器自动完成的(除非它被禁用)。 / p>
这并不意味着它被保存在磁盘中(出于什么目的?),它只是将其保存在内存中,用于会话cookie(在关闭浏览器时或30分钟后过期)。
您可以为Cookie设置更长的续航时间;在这种情况下,浏览器会将cookie存储更长时间。但通常这些不是“会话cookie”,而是用于识别特定用户(如UUID)的cookie。从UUID cookie中,您可以在同一用户重新连接时创建新的会话cookie。
会话用于跟踪 CONVERSATION 。用户关闭浏览器,会话结束。如果存在像UUID这样的持久性cookie,那么您可以使用该cookie创建新会话并将新会话绑定到您之前遇到的同一用户。