会话共享问题

时间:2010-09-18 13:04:11

标签: http web-applications session

我们在使用多个标签时遇到问题,因为它共享同一个会话。有什么替代品吗?当有人使用选项卡或CTRL + N时,我们可以创建一个唯一的会话。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我知道没有简单的方法可以实现这一目标。

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

如果用户在浏览多步骤表单时按下Ctrl + N,有几种解决方法可以“禁用”旧窗口,但是您必须提供更详细的信息。

答案 2 :(得分:0)

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

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