2009-11-03 64 views
1

我们的许多内部和外部用户启动我们的Web应用程序。然后在稍后的一段时间,他们从浏览器中打开一个新窗口。他们想要运行2个独立的应用程序会话。但是,通过这样做,他们实际上使用相同的会话数据。如何判断2个浏览器窗口是否共享会话?

有没有一种方法,在代码中,以确定是否有另一个浏览器窗口打开相同的会话?

我们使用VS 2008,C#和/或VB.Net。

谢谢。

COMBINING我的回复从下面:

也许我说这是错误的。当他们打开第二个窗口并将其更改为其他窗口小部件编号,然后返回到原始窗口时,在下一个回发窗口中将使用第二个窗口的窗口小部件编号,而不是其自己的窗口小部件编号

我们正在使用IE7。

回答

1

我测试过的应用程序(IE,FF和Google Chrome)上的主要浏览器都默认使用相同的Cookie集合,无论您是在新标签页还是新的浏览器实例中打开重复的网页。

结果是,默认情况下,2个不同的选项卡或同一浏览器的2个实例看起来与服务器的会话相同。

由于多个实例使用相同的cookie,因此服务器无法区分来自它们的请求,并且会将它们与相同的Session数据相关联,因为它们都具有相同的SessionID(假设基于Cookie的SessionID)。

通常情况下,这种行为没有任何问题,并且您需要针对该行为设置一个良好的商业案例以编码工作。

我不相信有可能从服务器端代码区分不同的浏览器选项卡。可能会有某种客户端脚本破解,这将有所帮助。

是否有助于包含一个Html元刷新标记,以便各个标签至少定期更新自己?另一方面,如果您将一组用户/服务器交互视为一种“会话内会话”,您可能可以通过存储一个随机Guid(或小部件编号)在ViewState,并检查它回发。

希望这会有所帮助。

+0

谢谢!我想要做的是应用程序启动时检查是否有另一个窗口使用同一个cookie/session,如果是,请关闭并在新的cookie/session中打开该应用程序。我知道如何在新会话中打开应用程序,但不知道如何检查它是否共享cookie /会话? – Jim 2009-11-04 14:13:36

+0

要做到这一点,您需要使用每个GET或POST发送到服务器的每个浏览器窗口的唯一标识符。也许你可以在javascript页面载入事件中生成一个随机的“窗口ID”(参考http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript),并将其存储在URL查询字符串或一个cookie,所以它在GET和POST都发送到服务器。 然后,服务器端代码需要通过会话跟踪窗口ID,并在看到与同一会话关联的2个不同窗口ID时采取行动。 我只会这样做,如果你真的需要寿! – saille 2009-11-04 20:01:18

0

他们没有共享相同的数据。在新的浏览器窗口中启动新会话,并启动单独的数据库访问。

+0

更正:新会话被创建,所以它=是一组新的会话日期。 – IrishChieftain 2009-11-03 19:56:41

+0

是的,如果用户使用Firefox,他们将共享相同的会话数据。我相信所有其他浏览器都会在新选项卡中实例化新会话。 – jennyfofenny 2009-11-03 20:37:35

+0

这发生在IE7中。 – Jim 2009-11-03 21:44:04

0

您可以检查Fiddler中的标头,也可以在Windows中输出Session.ID。会话是为每个浏览器实例创建的,而不是每个窗口。

+0

也许我是说这个错。当他们打开第二个窗口并将其更改为其他窗口小部件编号,然后返回到原始窗口时,在下一个回发窗口中,它将使用第二个窗口的窗口小部件编号,而不是它自己的窗口编号。 – Jim 2009-11-03 20:11:08

2
  • IE8-在选项卡和浏览器实例之间共享会话;可以使用文件 - >新建会话命令启动新会话
  • IE7 - 在选项卡之间共享会话,但不在浏览器实例之间共享
  • Firefox - 在选项卡和实例之间共享会话;另一个Firefox可以在不同的配置文件来启动(firefox.exe -P“PROFILENAME”个遥控),然后有单独的会话