2010-09-18 110 views
0

自从共享相同会话以来,我们在使用多个选项卡时遇到了一个问题。任何替代方案?当有人使用标签或CTRL + N时,我们可以创建一个独特的会话吗?会话共享问题

这是一个Java EE/Struts2企业应用程序,如果这很重要。

回答

0

没有简单的方法来实现我所知道的。

解决此问题的常用方法是更改​​应用程序,以便它可以使用多个选项卡(如果可能)处理用户。

对于如何在用户按下Ctrl + N的同时按下多步表单来“禁用”旧窗口,有几种解决方法,但您必须提供更详细的信息。

0

通常,为了进行会话跟踪,浏览器实例被视为单个用户/实体。特别是如果您使用Cookie来跟踪会话。我不确定我喜欢允许不同标签进行不同会话的想法。对于基于Web的应用程序来说,这感觉很不直观。当然,所有的恕我直言。

这就是说,如果你想改变这一点,你将不得不提出一个自定义的实现。也许你可以为不同的标签生成不同的会话ID并附加到URL。从来没有尝试过这个,所以不知道它会多么容易或困难。

1

这是所有以服务器为中心的Web应用程序面临的问题,它不是特定于Java EE的。问题是大多数浏览器都是以每个用户为基础存储cookie,而不是每个选项卡。此外,这种行为通常对用户不透明,增加了混淆。我能想到的一些解决方案(虽然它们都不是真的令人满意):

  • 将应用程序托管在多个URI下。这样,任何浏览器都将独立存储cookie,因此,每个应用程序版本都有一个会话。
  • 通过不同的机制传播会话ID,例如,通过URI。然而,这有一些注意事项 - 它向用户公开会话ID,它使用丑陋的URI,并且当用户复制粘贴或书签当前URI时形成安全风险(会话劫持等)(因为它们然后将会话ID存储在链接中)。
  • 通过页面内隐藏的字段传播会话ID。此解决方案可能需要您重写部分内置会话处理,并且当您的页面包含指向应用程序中其他页面的链接时,会丢失会话ID。
  • 对于Firefox,有一个名为“cookie pie”的插件,它允许用户为部分或全部选项卡提供独立的Cookie存储。缺点是用户必须主动启用它,解决标签问题成为用户的责任。此外,它在任何情况下都不起作用(例如,无论Google发现您的活动登录是什么)。
  • 避免使用会话状态,并使用其他机制来保持请求之间的状态。就像通过隐藏字段传递会话ID一样,这在某些情况下会中断。
  • 使应用程序完全以客户端为中心,即在javascript中编写整个接口并通过ajax调用与服务器进行通信。这样,你就不会依赖于浏览器的cookie实现。尽管您的应用程序基本上已经可以工作,但您仍然必须重写大量的代码。