关于浏览器会话和会话ID的一些问题/疑问?

时间:2013-04-23 13:21:03

标签: java session session-cookies session-management

根据我的理解,同一会话在同一浏览器窗口的不同选项卡之间共享。并针对不同的浏览器窗口,不同的会话 被建造。现在我的理解有些问题: -

1)当我在两个不同的浏览器窗口中点击我的Web应用程序时,我在firefox控制台上看到相同的jsession id。会话会话的内容如何 两个不同的浏览器窗口共享。默认情况下,会话是在创建的jsessionId的帮助下通过cookie维护的 通过网络服务器。通过在每个url请求中传递jsessionId来维护会话的URLRewriting维护会话的其他方式。 我可以在项目中看到使用org.tuckey.web.filters.urlrewrite.UrlRewriteFilter,但是这个类文档似乎没有做任何神奇的会话维护。 我不知道如何通过两个不同的浏览器窗口和技术方法来实现相同的会话

2)当我在同一个浏览器窗口的两个不同选项卡下点击两个不同的应用程序时相似 可能谷歌和其他一些网站说雅虎,我没有在这两个网站的firefox控制台中看到相同的jsessionId。是网站 在这里做一些特殊的东西来为每个Tab生成新的会话?事实上对于一些网站(可能是谷歌),我没有看到jsessionId 所有在firefox窗口下。怎么可能。我的理解是由网络服务器自动生成并通过 cookies或URLReWriting?

如果有人能够回答我的问题,那将会很有帮助,因为了解这里发布的会话管理的每个要点非常重要

更新: - 让我用不同的方案提出问题: -

1)在同一浏览器窗口的两个不同标签中点击两个不同的网址(例如google.com和stackoverflow.com)。

  

我的理解: - 将创建两个会话,因为将为两个不同的域/端口

创建两个cookie

2)在同一个浏览器窗口的两个不同选项卡中输入两个相同的URL(比如stackoverflow.com)。

  

我的理解: - Onesession将被创建,因为相同的cookie将被重用

3)在两个完全不同的浏览器窗口(firefox)中输入两个相同的URL(比如stackoverflow.com)。

  

我的理解: - 在这种情况下会创建多少个会话?

2 个答案:

答案 0 :(得分:4)

你的第一个假设是不正确的。如果对cookie使用会话管理(Java servlet容器的默认设置),则会话在同一浏览器实例的所有窗口中都可见。

如果将Java servlet服务器配置为仅对会话使用URL重写,则每个选项卡可以有一个会话。

通常,两个不同的Java Web应用程序将始终创建两个不同的会话cookie,仅对其自己的应用程序范围有效。 Cookie绑定到域和路径。

像PHP这样的其他Web框架可以完全不同。

答案 1 :(得分:1)

cookie jsession_id由服务器创建,服务器通过HTTP头Set-Cookie将其发送给浏览器以换取请求。 cookie由浏览器存储在客户端上。此后,浏览器将为同一域上的每个后续请求重新发送该cookie(可以使用安全路径https://en.wikipedia.org/wiki/HTTP_cookie#Terminology来限制cookie,但这里无关紧要。)

浏览器可以从所有选项卡(基本权限和安全性)访问该cookie,如果它分隔会话(所有选项卡上的相同cookie)或合并它们(所有选项卡上的相同cookie,因此同一会话,它)是一种设计选择同一域中的所有选项卡)。据我所知,所有浏览器都选择在标签上共享cookie,但我不是专家。

因此,为了在同一个java程序的多个实例上维护会话,您需要执行相同的操作并将jsession_id cookie(并在相关时重用它)存储在每个实例的内存之外(例如,在文件中)。如果安全性很重要,这可能并不重要。

关于第2点,重要的是要理解即使两个cookie都是jsession_id,它们也与不同的域相关(并且已由每个服务器设置),因此它们没有理由相等。